Base
包含许多类型级布尔操作的类型系列,如下所示:
https://hackage.haskell.org/package/base-4.8.2.0/docs/Data-Type-Bool.html
但是,指向True
和False
的链接只是引用Bool
的数据构造函数,而不是类型本身,所以可能它们不能用于类型级操作,因为他们的价值观,而不是类型。
有人可以解释一下这里发生了什么以及在哪里可以找到类型级定义吗?
答案 0 :(得分:6)
指向
True
和False
的链接只是引用Bool
的数据构造函数,而不是类型本身
没错。实际上它们不是类型(例如True
会有什么值 * )?它们本身仍然只是Bool
类型的值。只是,整个类型已经通过-XDataKinds
extension“提升”了一个级别,因此Bool
现在也是类型级别类型:又名种类。
传统上在Haskell中,我们主要使用一种该死的单一类型:*
,这种普通类型†。此类包含Bool
和String
以及IO ()
和(Int -> Double) -> Char
...实际上具有值‡的所有内容。加上构造函数种类,它们都是* -> *
形式,包含Maybe
或[]
(当不应用于包含类型参数时)
现在使用DataKinds
,我们有一整套类型:你可以在运行时使用的任何类型§ - Haskell代码现在也可以在编译时用作一种类型!所有这些类型都包含它们在运行时级别上也具有的值。但是那些类型级别的值,例如您询问的False
和True
,不实际类型,它们只存在于类型级别。但您可以构建实际的*
类型,例如像
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
这样的简单类型肯定会被解除可以。子>