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