고차 카인드 타입(Higher-Kinded Types, HKT)은 타입 생성자(type constructor)를 인자로 받는 타입 추상화다. Functor, Monad 같은 고수준 추상화를 표현하는 데 필수적이다.
카인드(Kind) 시스템
카인드 = 타입의 타입
Int :: * (구체 타입)
Maybe :: * -> * (타입 생성자, 1차)
Either :: * -> * -> * (이항 타입 생성자)
고차 카인드:
Functor :: (* -> *) -> Constraint
Monad :: (* -> *) -> Constraint
Haskell에서의 HKT
haskell
-- f :: * -> * 를 받는 타입 클래스
class Functor f where
fmap :: (a -> b) -> f a -> f b
-- ^ f가 * -> * 인 타입 생성자
-- Maybe, List, IO 등이 Functor 인스턴스
-- Int, Bool 등은 Functor 불가 (카인드가 * )
-- 2차 카인드
class (Functor t) => Foldable (t :: * -> *) where
foldr :: (a -> b -> b) -> b -> t a -> b
-- 트랜스포머에서의 HKT
class MonadTrans (t :: (* -> *) -> * -> *) where
lift :: Monad m => m a -> t m a
Scala에서의 HKT
scala
// F[_]: 타입 생성자를 인자로 받는 제네릭
trait Functor[F[_]] {
def map[A, B](fa: F[A])(f: A => B): F[B]
}
// Option Functor 구현
implicit val optionFunctor: Functor[Option] = new Functor[Option] {
def map[A, B](fa: Option[A])(f: A => B): Option[B] = fa.map(f)
}
// HKT를 활용한 traverse
def traverse[F[_]: Applicative, A, B](list: List[A])(f: A => F[B]): F[List[B]]
Java에서의 HKT 우회
java
// Java는 HKT 미지원 → Kind 인코딩으로 우회
// Lightweight Higher-Kinded Polymorphism 기법
interface Kind<F, A> {} // F<A>를 Kind<F, A>로 인코딩
interface Functor<F> {
<A, B> Kind<F, B> map(Kind<F, A> fa, Function<A, B> f);
}
// Vavr, Arrow-kt 등 라이브러리에서 활용
언어별 HKT 지원
| 언어 | HKT 지원 | 방식 |
|---|
| Haskell | 완전 지원 | 기본 내장 |
| Scala | 완전 지원 | F[_] 문법 |
| Rust | 미지원 | GAT(관련 타입)로 부분 가능 |
| Java | 미지원 | Kind 인코딩으로 우회 |
| TypeScript | 제한적 | 인터페이스 병합으로 시뮬레이션 |
관련 개념