Haskell的DataTypes扩展是什么?
我正试图找到一个解释的DataTypes扩展,这将是有意义的,因为我只是来阅读。是否有一个标准的来源,将有意义的我所学到的很少 编辑:例如 使用-xDataTypes,GHC会自动升级每个合适的数据类型 是一种类型,其(值)构造函数是类型构造函数。 以下类型 并举例说明Haskell的DataTypes扩展是什么?,haskell,types,algebraic-data-types,data-kinds,Haskell,Types,Algebraic Data Types,Data Kinds,我正试图找到一个解释的DataTypes扩展,这将是有意义的,因为我只是来阅读。是否有一个标准的来源,将有意义的我所学到的很少 编辑:例如 使用-xDataTypes,GHC会自动升级每个合适的数据类型 是一种类型,其(值)构造函数是类型构造函数。 以下类型 并举例说明 data Nat = Ze | Su Nat 产生以下类型的施工人员: Nat :: BOX Ze :: Nat Su :: Nat -> Nat 我不明白重点。虽然我不明白BOX的意思,但是Ze::Nat和Su::N
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
打印此类内容
数据种类
现在这不是很有用,因为我们没有办法做我们自己的种类!当我们编写
data Nat = S Nat | Z
GHC将对此进行推广,以创建相应的Nat类型
Prelude> :k S
S :: Nat -> Nat
Prelude> :k Z
Z :: Nat
因此,DataKind
s使kind系统具有可扩展性
使用
让我们使用GADTs做一个原型种类的例子
data Vec :: Nat -> * where
Nil :: Vec Z
Cons :: Int -> Vec n -> Vec (S n)
现在我们看到我们的Vec
类型是按长度索引的
这是10公里英尺的基本概述
*这实际上是继续的,Values:Types:Kinds:Sorts…
一些语言(Coq、Agda…)支持这个无限的宇宙堆栈,但Haskell将所有东西都归为一种排序。我的观点如下:
考虑以下类型的长度索引向量:
data Vec n a where
Vnil :: Vec Zero a
Vcons :: a -> Vec n a -> Vec (Succ n) a
data Zero
data Succ a
这里我们有一种Vec::*->*->*
。因为可以通过以下方式表示Int的零长度向量:
Vect Zero Int
您还可以声明无意义的类型,例如:
Vect Bool Int
这意味着我们可以在类型级别进行非类型化函数编程。因此,我们通过引入数据类型来消除这种模糊性,并且可以有这样一种:
Vec :: Nat -> * -> *
现在我们的Vec
得到一个名为Nat
的数据种类,我们可以声明为:
datakind Nat = Zero | Succ Nat
通过引入一种新的数据类型,没有人可以声明一个无意义的类型,因为Vec
现在有一个更受约束的种类签名。这是否意味着表达式S::Nat->Nat
被重载了,因为它可以引用S
作为数据构造函数,引用类型为Nat
的参数,或者S
作为类型构造函数,引用类型为参数Nat类型的Nat
?您的data-Vec::Nat->*
示例是否应改为data-Vec a::Nat->*
,以反映Vec
采用类型参数?@user782220 1。是的。不,我故意使Vec
为单态,如果你想我认为最容易忽略的是,没有数据类型,S
和Z
不是类型,而是生成类型Nat
的类型构造函数。对于数据类型,它们是类型,其类型是Nat
。它们以前不是类型这一事实意味着以前它们不能在类型签名中引用,这就是本文的全部内容。@Jules,那条评论应该是答案!通常,当我看到使用-XDataKinds时,这是因为有些东西需要函数签名中的构造函数(或者相反,当您想知道如何在函数签名中放置构造函数时,-XDataKinds是答案),“s
和Z
不是类型,而只是生成类型Nat
的类型构造函数。”应该是数据构造函数,在类型级别生成Nat
非类型函数编程类型的数据是一个很好的观察结果。这正是Simon Peyton Jones在他的一次讲座中所说的。看见