DataKinds
DataKinds 言語拡張を有効にすると、データコンストラクタを型へ、型を種へ昇格させることができる。
型と値 (通常)
code: (hs)
data SimpleData a = SimpleData a
table:table
通常
値 SimpleData :: a -> SimpleData a
型 SimpleData ::* ->*
種
型と値 (DataKinds 有効)
code: (hs)
{-# LANGUAGE DataKinds #-}
data SimpleData a = SimpleData a
DataKinds 言語拡張を有効にすることで、次のような変化が起きる。
table:table
通常 DataKinds
値 SimpleData :: a -> SimpleData a SimpleData :: a -> SimpleData a
型 SimpleData ::* ->* SimpleData ::* ->* 'SimpleData :: k -> SimpleData k
種 SimpleData ::* ->*
新たに、型に 'SimpleData が追加され、種に SimpleData が追加される。
型のみ (DataKinds 有効)
また、値が無い場合も同様に定義可能である。
code: (haskell)
{-# LANGUAGE DataKinds #-}
data SimpleData a
table:table
通常 DataKinds
値
型 SimpleData ::* ->* SimpleData ::* ->*
種 SimpleData ::* ->*
この場合はコンストラクタがないため、型は追加されない。
値と型と種の名前空間
Kind and Type Namespaces によると、型と種は同じ名前空間を共有しているため、実際には種の行は存在しない。
そのため、正確にはそれぞれこのような表となる。
型と値の場合
table:table
通常 DataKinds
値 SimpleData :: a -> SimpleData a
型 SimpleData ::* ->* 'SimpleData :: k -> SimpleData k SimpleData ::* ->*
種
型のみの場合
table:table
通常 DataKinds
値
型・種 SimpleData ::* ->* SimpleData ::* ->*
関連する記録
9.10. Datatype promotion - GHC ユーザーズガイド
About kind system of Haskell (Part 1) 種の仕組みとそれに付随する言語拡張について
Haskellの種(kind)について (Part 2) 種の仕組みとそれに付随する言語拡張について