我正在尝试找到一个关于DataKinds扩展的解释,以便我从只读过Learn You a Haskell的情况下理解。是否有一个标准的来源可以让我用我所学的少量知识来理解?
编辑:例如documentation中所说:
通过-XDataKinds,GHC会自动将每个适当的数据类型提升为一种(kind),并将其(value)构造函数提升为类型构造函数。以下是示例。
产生以下种类和类型构造函数:
编辑:例如documentation中所说:
通过-XDataKinds,GHC会自动将每个适当的数据类型提升为一种(kind),并将其(value)构造函数提升为类型构造函数。以下是示例。
data Nat = Ze | Su Nat
产生以下种类和类型构造函数:
Nat :: BOX
Ze :: Nat
Su :: Nat -> Nat
我不明白重点在哪里。虽然我不理解BOX
是什么意思,但Ze :: Nat
和Su :: Nat -> Nat
这两个语句似乎已经陈述了Ze和Su是正常的数据构造函数,就像你在ghci中看到的那样。
Prelude> :t Su
Su :: Nat -> Nat
S :: Nat -> Nat
是重载的,因为它可以引用S
作为一个取一个类型为Nat
的参数的数据构造函数或者引用S
作为一个取一个种类为Nat
的参数的类型构造函数?你的data Vec :: Nat -> *
的例子应该改为data Vec a :: Nat -> *
来反映Vec
接受一个类型参数吗? - user782220Vec
单态化,如果您愿意可以这样做。 - daniel gratzerS
和Z
不是类型,而只是生成类型Nat
的类型构造函数。有了DataKinds,它们就成为类型,其种类为Nat
。它们以前不是类型的事实意味着以前不能在类型签名中引用它们,而这正是这一切的关键所在。 - Jules