2016-09-07 136 views
3

对于( - >),我们有:数据( - >)a b是什么意思?

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

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

(( - >)通常如何说出或发音?

+1

'(+)a b'等价于表达式层面的'a + b'。 '( - >)a b'等同于类型级别的'a - > b''。用括号括起中缀表达式就是你如何在前缀中编写它。 –

回答

11

(->)是函数类型,人们通常将其声明为“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有两个(幻影)的论点有除⊥没有价值,就像Void类型从Data.Void

如果你要玩的缀语法,您可以定义一个类型的操作与TypeOperators扩展启用,具有相同的含义Foo

data a +~ b 

data (+~) a b 

这例如,如果我们想模拟OCaml并将其写入a * b而不是(a, b)

type a * b = (a, b)