data (->) a b 是什么意思?

What does data (->) a b mean?

对于 (->) 我们有:

Prelude> :i (->)
data (->) t1 t2         -- Defined in ‘GHC.Prim’

这个语法是什么意思?我认为数据声明关键字在 LHS 上需要一个类型构造函数,在 RHS 上需要一个或多个值构造函数?

(->) 通常怎么说或发音?

(->)是函数类型,人们一般读作"to"(即a -> b读作"a to b")。

(->) 是内置于 GHC 中的原始构造:编译器会专门处理它。但是,一些像 :i 这样使用普通类型的工具会看到 (->) 的虚假定义,就好像它是一个空数据类型一样:

data (->) a b

这允许 :i 为您提供有关内置操作的信息,就好像它是一个普通定义一样。

(->) a b 语法是中缀名称的前缀版本,就像您可以以前缀形式定义普通运算符一样:

a ~+ b = a * b + b

相同
(~+) a b = a * b + b

如果您实际上自己尝试以这种方式定义 (->),您会得到一个错误:

<interactive>:20:1-13: error:
    Illegal binding of built-in syntax: (->)

但是,如果您给它们一个有效的名称,您可以自己定义这样的空数据类型:

data Foo a b

这使得 Foo 具有两个(幻象)参数,除 ⊥ 外没有任何值,就像 Data.Void.

中的 Void

如果你想玩转中缀语法,你可以定义一个类型运算符并启用 TypeOperators 扩展,其含义与 Foo:

相同
data a +~ b

data (+~) a b

这可能很有用,例如,如果我们想要模拟 OCaml 并将对类型写为 a * b 而不是 (a, b):

type a * b = (a, b)