在Haskell 98报告中,我发现了这一点:
上面给出了Haskell类型表达式的语法。正如使用数据构造函数构建数据值一样,类型值也是从类型构造函数构建的。与数据构造函数一样,类型构造函数的名称从大写字母开始。与数据构造函数不同,不允许使用Infix类型构造函数(( ->)除外)。
没有理由为什么不允许给出 Infix类型的构造函数。在AGDA等中,Infix型构造函数很普遍。为什么不在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都允许Infix value构造函数,例如
data Complex r = r :+ r
在这里,值构造函数 (:+)
是infix,如 5 :+ 7
。
您只需要TypeOperators
扩展名即可具有类型构造函数是infix。例如,
data x ??! y = Left x | Right y
在此类型构造函数(??!)
是Infix,如Int ??! Bool
中。