top page > computer > haskell > web_lecture > for_programmer > kind.html
更新日:
文責: 重城良国

種類(kind)とは

(工事中 70%)

はじめに

型レベルプログラミングの世界は深くて広い。入口には「この門をくぐる者は一切の希望を捨てよ」と書いてある。僕自身、門のむこうには行ったことがない。おそらく、その門をくぐる前に知っておく必要のある知識のうちのひとつが種類(kind)である。ここではごく簡単な説明だけとしておく。

種類(kind)とは

種類(kind)とは型の型だ。型にも型がありその型の型のことを種類(kind)とよぶ。

コードには出てこない

言語拡張を使わないかぎりコードのなかに種類(kind)が出てくることはない。対話環境から見ることはできる。

値の型は:tで見ることができる。

% ghci
Prelude> :t True
True :: Bool
Prelude> :t Just 'a'
Just False :: Maybe Char

型の種類(kind)は:kで見ることができる。

Prelude> :k Bool
Bool :: *
Prelude> :k Int
Int :: *
Prelude> :k Char
Char :: *

Bool, Int, Charといった型の種類は*(star)であることがわかる。*(star)以外の種類の型についても見ていこう。

Prelude> :k Maybe
Maybe :: * -> *
Prelude> :k []
[] :: * -> *
Prelude> :k Either
Either :: * -> * -> *

Maybe, []といった型の種類は* -> *だ。Eitherは* -> * -> *という種類であることがわかる。どういうことだろうか。

Prelude> :k Either
Either :: * -> * -> *
Prelude> :k Either Bool
Either Bool :: * -> *
Prelude> :k Either Bool Char
Either Bool Char :: *

(* -> * -> *)型のEitherに*型のBoolをあたえると(* -> *)型の型となる。さらに(* -> *)型のEither Boolに*型のCharをあたえると*型の型となる。関数適用と同じことが型レベルでも行われているということだ。

(* -> *)型の型は引数をひとつあたえて*型の型にしなければ値を型づけすることはできない。たとえばx :: Maybeのような型づけはできない。x :: Maybe Intのように型引数をとって*型の型にする必要がある。

まとめ

値と同じように型にも型があり、それを種類(kind)とよぶ。種類には*, * -> *, * -> * -> *, ...などがある。値を型づけするためには型引数を必要なだけあたえて種類を*にまでする必要がある。

「型クラス: Num」へもどる 「種類(* -> *)に対する型クラス」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics