在Haskell 98 报告中,我发现了这个:
上面给出了 Haskell 类型表达式的语法。正如使用数据构造函数构建数据值一样,类型值也是从类型构造函数构建的。与数据构造函数一样,类型构造函数的名称以大写字母开头。与数据构造函数不同,中缀类型构造函数是不允许的(除了 (->))。
没有给出为什么不允许中缀类型构造函数的原因。在 Agda 等中,中缀类型构造函数是司空见惯的。为什么不在 Haskell 中?
在Haskell 98 报告中,我发现了这个:
上面给出了 Haskell 类型表达式的语法。正如使用数据构造函数构建数据值一样,类型值也是从类型构造函数构建的。与数据构造函数一样,类型构造函数的名称以大写字母开头。与数据构造函数不同,中缀类型构造函数是不允许的(除了 (->))。
没有给出为什么不允许中缀类型构造函数的原因。在 Agda 等中,中缀类型构造函数是司空见惯的。为什么不在 Haskell 中?
它不是 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
只是要完全清楚:Haskell 98 和 Haskell 2000 都允许中缀值构造函数,例如
data Complex r = r :+ r
这里的值构造函数(:+)
是中缀的,如5 :+ 7
.
您只需要TypeOperators
扩展具有中缀的类型构造函数。例如,
data x ??! y = Left x | Right y
这里类型构造函数(??!)
是中缀的,如Int ??! Bool
.