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

AJF*_*mar 8 constructor haskell types infix-operator

Haskell 98报告中,我发现了这个:

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

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

bhe*_*ilr 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
Run Code Online (Sandbox Code Playgroud)

  • 您不需要使用`:`为中缀构造函数启用`TypeOperators`,但可以编写`data A ab = a:> b派生Show (6认同)

Mat*_*hid 10

只是要完全清楚:Haskell 98和Haskell 2000都允许中缀值构造函数,如

data Complex r = r :+ r
Run Code Online (Sandbox Code Playgroud)

这里的值构造函数(:+)是中缀,如5 :+ 7.

您只需要TypeOperators扩展名具有中缀的类型构造函数.例如,

data x ??! y = Left x | Right y
Run Code Online (Sandbox Code Playgroud)

这里的类型构造函数(??!)是中缀,如Int ??! Bool.

  • 仅供参考:Haskell 2010 报告使用术语“数据构造函数”而不是“值构造函数”,我记得 2010 年之前的一些书也使用“数据构造函数”。 (2认同)