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

11
Haskell 98报告书中,我发现了以下内容:

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

并没有提供为什么不允许使用中缀类型构造器的原因。在Agda等语言中,常见使用中缀类型构造器。那么为什么Haskell不允许呢?

2
Haskell本身可能不支持,但GHC有相应的扩展功能。请参考https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/data-type-extensions.html。 - jamshidh
2个回答

16

这不是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

6
你不需要启用TypeOperators来使用中缀构造器:,而是可以这样写:data A a b = a :> b deriving Show`。 - Michael

12

为了完全清楚:Haskell 98和Haskell 2000都允许中缀值构造函数,例如

data Complex r = r :+ r

这里的值构造函数(:+)是中缀的,就像5 :+ 7一样。

你只需要使用TypeOperators扩展来使得类型构造函数成为中缀。例如,

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

这里的类型构造器(??!)是中缀形式,例如Int ??! Bool


1
FYI:Haskell 2010报告使用“数据构造器”一词而非“值构造器”,我记得2010年之前的一些书籍也使用了“数据构造器”。 - SnowOnion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接