kind
日本語では「種」と言う
型の型
:k
、 :kind
で調べられる
ghciPrelude> :k Int
Int :: *
*
(スター)は具体型を表す
様々なkind
*
具体型、データ型のkind
Intとか
->
関数のkind
Constraint
MaybeやEitherは型コンストラクタで、具体型を引数にとって具体型になる
shellPrelude> :k Maybe
Maybe :: * -> *
Prelude> :k Either
Either :: * -> * -> *
例えば、Maybeに型引数も指定した型のkindを調べると *
(具体型)となる
shellPrelude> :k Maybe String
Maybe String :: *
型引数を取る型は部分適用できる
Eitherに1つ型を指定すると、「型引数に具体型を1つ取って具体型になる型」になる
shellPrelude> :k Either String
Either String :: * -> *
例
kindが *
なものの例
具体型
値コンストラクタ
e.g. Int
、 String
型コンストラクタに完全に型を詰めたやつ
e.g. Either Int String
、 Maybe Bool
関数型
Int -> Int -> Bool
↓こういう定義の Void
型
hsdata Void
newtype Void = Void Void
値コンストラクタを持たない0引数型コンストラクタ
kindが *->*
なものの例
Maybe
、 []
kindが *->*->*
なものの例
Either
、2-タプル型、関数型 (->)
勝手にされる
逆に言えば、自分で指定できないので融通が効かないことがある
ref ref2
参考
詳しい、最初に読むと良い
やばい
