繁体   English   中英

什么是Haskell的DataKinds扩展?

[英]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 :: NatSu :: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM