关于基本类型级别的混淆

时间:2016-02-23 08:50:52

标签: haskell

Base包含许多类型级布尔操作的类型系列,如下所示:

https://hackage.haskell.org/package/base-4.8.2.0/docs/Data-Type-Bool.html

但是,指向TrueFalse的链接只是引用Bool的数据构造函数,而不是类型本身,所以可能它们不能用于类型级操作,因为他们的价值观,而不是类型。

有人可以解释一下这里发生了什么以及在哪里可以找到类型级定义吗?

1 个答案:

答案 0 :(得分:6)

  

指向TrueFalse的链接只是引用Bool的数据构造函数,而不是类型本身

没错。实际上它们不是类型(例如True会有什么值 * )?它们本身仍然只是Bool类型的值。只是,整个类型已经通过-XDataKinds extension“提升”了一个级别,因此Bool现在也是类型级别类型:又名种类

传统上在Haskell中,我们主要使用一种该死的单一类型:*,这种普通类型。此类包含BoolString以及IO ()(Int -> Double) -> Char ...实际上具有值的所有内容。加上构造函数种类,它们都是* -> *形式,包含Maybe[](当应用于包含类型参数时)

现在使用DataKinds,我们有一整套类型:你可以在运行时使用的任何类型§ - Haskell代码现在也可以在编译时用作一种类型!所有这些类型都包含它们在运行时级别上也具有的值。但是那些类型级别的值,例如您询问的FalseTrue实际类型,它们只存在于类型级别。但您可以构建实际的*类型,例如像

这样的东西
data CanContain :: Bool -> * -> * where
  Interesting :: a -> CanContain True a
  Boring :: CanContain False a

然后类型为X -> CanContain True Y的函数必须实际生成Y值,但类型为X -> CanContain False Y的函数不需要。

* 不,答案不是True。但是,我们可以实现type Bool = Either False True,这有点意义。

可以说,在一种语言中,这不是一个非常好的名称,否则会将*解析为中缀符号。它实际上将来会改变。

这不是那么简单:还有未装箱的种类,但这些都是技术细节。

§ 正如dfeuer所说,不是所有类型现在都可以解除(GHC-7.10),但是Bool这样的简单类型肯定会被解除可以。