对于( - >)我们有:
Prelude> :i (->)
data (->) t1 t2 -- Defined in ‘GHC.Prim’
这种语法是什么意思?我认为数据声明关键字需要LHS上的类型构造函数和RHS上的一个或多个值构造函数?
如何( - >)一般说出或发音?
答案 0 :(得分:12)
C
是函数类型,人们通常将其发音为" to" (即(->)
将被发音" a到b")。
a -> 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
的{{1}}一样。
如果您想使用中缀语法,可以定义一个启用了Void
扩展名的类型运算符,其含义与Data.Void
相同:
TypeOperators
或
Foo
例如,如果我们要模拟OCaml并将对类型写为data a +~ b
而不是data (+~) a b
,那么这可能很有用:
a * b