Haskell的DataKinds以及值,类型和种类的关系

时间:2015-10-29 20:11:37

标签: haskell types type-kinds

说我有这个:

data Animal = Dog | Cat
:t Dog
Dog :: Animal

足够公平。

:k Dog

<interactive>:1:1:
    Not in scope: type constructor or class ‘Dog’
    A data constructor of that name is in scope; did you mean DataKinds?

因为狗是一种价值而不是一种类型,所以不要指望这样做。你不能得到一种价值,只有一种类型,对吗?

但是,如果我这样做:

:set -XDataKinds
data Animal = Dog | Cat
:k Dog
Dog :: Animal

这意味着你能获得某种价值是什么意思?

1 个答案:

答案 0 :(得分:10)

不。你只能得到各种类型。 -XDataKinds所做的是获取数据声明并赋予它们两个含义:首先,它声明一个新类型和一些相应的值构造函数;第二,它声明了一个新的和一些相应的类型构造函数。因此,在DataKinds开启时,以下声明:

data Animal = Dog | Cat

创建以下所有

  • 输入Animal
  • Dog类型的Animal
  • Cat类型的Animal
  • kind Animal
  • 类型Dog
  • Animal类型
  • 类型Cat
  • Animal类型

三个名称空间 - 术语级别,类型级别和类型级别 - 完全不相交。如果DataKinds将以两种不同的方式定义新类型,您可以使用前缀'来表示您想要提升版本。因此:

> :set -XDataKinds
> data Animal = Animal
> :k Animal
Animal :: *
> :k 'Animal
'Animal :: Animal