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)
对于 (->) 我们有:
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)