【问题标题】:Haskell: Why aren't infix type constructors allowed?Haskell:为什么不允许中缀类型构造函数?
【发布时间】:2015-07-14 08:52:15
【问题描述】:

Haskell 98 report,我发现了这个:

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

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

【问题讨论】:

标签: haskell types constructor infix-operator


【解决方案1】:

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

【讨论】:

  • 你不需要为带有:的中缀构造函数启用TypeOperators,但可以写data A a b = a :> b deriving Show
【解决方案2】:

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

data Complex r = r :+ r

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

您只需要TypeOperators 扩展来拥有类型构造函数,它们是中缀的。例如,

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

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

【讨论】:

  • 仅供参考:Haskell 2010 报告使用术语“数据构造函数”而不是“值构造函数”,我记得 2010 年之前的一些书籍也使用“数据构造函数”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2019-07-24
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多