generated at
DataKinds
DataKinds 言語拡張を有効にすると、データコンストラクタを型へ、型を種へ昇格させることができる。

型と値 (通常)

(hs)
data SimpleData a = SimpleData a

table
通常
SimpleData :: a -> SimpleData a
SimpleData ::* ->*

型と値 (DataKinds 有効)

(hs)
{-# LANGUAGE DataKinds #-} data SimpleData a = SimpleData a

DataKinds 言語拡張を有効にすることで、次のような変化が起きる。

table
通常DataKinds
SimpleData :: a -> SimpleData aSimpleData :: a -> SimpleData a
SimpleData ::* ->*SimpleData ::* ->* 'SimpleData :: k -> SimpleData k
SimpleData ::* ->*

新たに、型に 'SimpleData が追加され、種に SimpleData が追加される。

型のみ (DataKinds 有効)

また、値が無い場合も同様に定義可能である。

(haskell)
{-# LANGUAGE DataKinds #-} data SimpleData a

table
通常DataKinds
SimpleData ::* ->*SimpleData ::* ->*
SimpleData ::* ->*

この場合はコンストラクタがないため、型は追加されない。

値と型と種の名前空間

Kind and Type Namespaces によると、型と種は同じ名前空間を共有しているため、実際には種の行は存在しない。

そのため、正確にはそれぞれこのような表となる。

型と値の場合

table
通常DataKinds
SimpleData :: a -> SimpleData a
SimpleData ::* ->*'SimpleData :: k -> SimpleData k SimpleData ::* ->*

型のみの場合

table
通常DataKinds
型・種SimpleData ::* ->*SimpleData ::* ->*

関連する記録