Haskell的DataTypes扩展是什么?

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

我正试图找到一个解释的DataTypes扩展,这将是有意义的,因为我只是来阅读。是否有一个标准的来源,将有意义的我所学到的很少

编辑:例如

使用-xDataTypes,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
打印此类内容

数据种类 现在这不是很有用,因为我们没有办法做我们自己的种类!当我们编写

 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在他的一次讲座中所说的。看见