Haskell:为什么不允许使用中缀类型构造函数?

时间:2015-05-04 20:12:30

标签: haskell types constructor infix-operator

Haskell 98 report中,我发现了这一点:

  

上面给出了Haskell类型表达式的语法。正如使用数据构造函数构建数据值一样,类型值也是从类型构造函数构建的。与数据构造函数一样,类型构造函数的名称以大写字母开头。与数据构造函数不同,不允许使用中缀类型构造函数(除了( - >))。

没有给出为什么中缀类型构造函数不被允许的原因。在Agda等中,中缀型构造函数是常见的。为什么不在Haskell?

2 个答案:

答案 0 :(得分:15)

它不是Haskell标准的一部分,但正如jamshidh提到的那样,它仍然可以在GHC中使用。需要注意的是,数据构造函数(不是类型构造函数)必须以冒号开头:

{-# LANGUAGE TypeOperators #-}

data a + b = a :+ b

f :: a + b -> a
f (a :+ b) = a

g :: a + b -> b
g (a :+ b) = b

答案 1 :(得分:9)

完全清楚:Haskell 98和Haskell 2000都允许使用infix 值构造函数,例如

data Complex r = r :+ r

此处,值构造函数(:+)为中缀,如5 :+ 7

您只需要TypeOperators扩展名即类型构造函数,它们是中缀。例如,

data x ??! y = Left x | Right y

此处类型构造函数(??!)为中缀,如Int ??! Bool