[英]What is the DataKinds extension of Haskell?
我试图找到一个对DataKinds扩展的解释,这对我来说只是读过Learn You a Haskell才有意义。 是否有一个标准的来源,对我来说,我学到的东西很少?
编辑:例如文档说
使用-XDataKinds,GHC会自动将每个合适的数据类型提升为一种类型,并将其(值)构造函数作为类型构造函数。 以下类型
并举例说明
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
好吧,让我们从基础开始吧
例如,种类是类型*的类型
Int :: *
Bool :: *
Maybe :: * -> *
请注意->
重载也意味着类型级别的“功能”。 所以*
是一种普通的Haskell类型。
我们可以要求GHCi用以下方法打印某种东西:k
。
现在这不是很有用,因为我们无法自己制作! 有了DataKinds
,我们写的时候
data Nat = S Nat | Z
GHC将促进这种创造相应的Nat
和
Prelude> :k S
S :: Nat -> Nat
Prelude> :k Z
Z :: Nat
所以DataKind
使得类型系统可扩展。
让我们使用GADT做原型种类的例子
data Vec :: Nat -> * where
Nil :: Vec Z
Cons :: Int -> Vec n -> Vec (S n)
现在我们看到我们的Vec
类型按长度索引。
这是10k英尺的基本概述。
*这实际上还在继续, Values : Types : Kinds : Sorts ...
有些语言(Coq,Agda ..)支持这种无限的宇宙堆栈,但是Haskell将所有东西都归为一类。
这是我的看法:
考虑一个长度索引的Vector类型:
data Vec n a where
Vnil :: Vec Zero a
Vcons :: a -> Vec n a -> Vec (Succ n) a
data Zero
data Succ a
这里有一个Kind Vec :: * -> * -> *
。 因为您可以通过以下方式表示Int的零长度Vector:
Vect Zero Int
你也可以声明无意义的类型说:
Vect Bool Int
这意味着我们可以在类型级别进行无类型的函数式编程。 因此,我们通过引入数据类型来消除这种模糊性,并且可以具有这样的类型:
Vec :: Nat -> * -> *
所以现在我们的Vec
得到一个名为Nat
的DataKind,我们可以声明为:
datakind Nat = Zero | Succ Nat
通过引入一种新的数据类型,没有人能够声明无意义的类型,因为Vec
现在具有更受约束的类型签名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.