说我有这个:
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
这意味着你能获得某种价值是什么意思?
答案 0 :(得分:10)
不。你只能得到各种类型。 -XDataKinds
所做的是获取数据声明并赋予它们两个含义:首先,它声明一个新类型和一些相应的值构造函数;第二,它声明了一个新的种和一些相应的类型构造函数。因此,在DataKinds
开启时,以下声明:
data Animal = Dog | Cat
创建以下所有:
Animal
Dog
类型的Animal
Cat
类型的Animal
Animal
Dog
Animal
类型
Cat
Animal
类型
三个名称空间 - 术语级别,类型级别和类型级别 - 完全不相交。如果DataKinds
将以两种不同的方式定义新类型,您可以使用前缀'
来表示您想要提升版本。因此:
> :set -XDataKinds
> data Animal = Animal
> :k Animal
Animal :: *
> :k 'Animal
'Animal :: Animal