为什么`(:)`内置?

时间:2015-09-02 20:57:08

标签: haskell

我注意到这两个定义无法在Haskell文档的最官方资源中找到:

(:) :: a -> [a] -> [a]
data [] a = [] | a : []

我检查了Hoogle,data [](:)没有条目。这两个不应该是#34;正常"功能和数据类型?

修改:在Haskell 2010 Language Report中,他们说

-- The (:) operator is built-in syntax, and cannot legally be given  
-- a fixity declaration; but its fixity is given by:  
--   infixr 5  :  

但为什么呢?是否有特殊原因可以挑出这个功能?

2 个答案:

答案 0 :(得分:16)

它是内置的语法,而不是内置的功能。函数(:)只是内置类型[]的两个构造函数之一。但是:

  • 类型名称[]对于类型名称不是有效的Haskell语法;所以它必须是内置的语法。
  • 同样,[a]实例化的类型语法[]是内置语法。
  • 另一个构造函数[]的名称对于构造函数名称不是有效的Haskell语法;所以它必须是内置的语法。
  • 列表文字语法[ x, y, z ]是内置语法(显然)。

由于基本上关于类型[]的所有其他内容都是内置语法,因此决定使:内置语法,而不是让它成为实际上的一个例外。语言中的有效名称。

答案 1 :(得分:3)

(:)不是正常函数,但是你发布的(无效的haskell 98)定义中的两个数据构造函数之一(编辑我认为这是有争议的,因为这个定义是反正不是真正的语法...)

data [] a = [] | a : []

但确实有你发布的类型(:) :: a -> [a] -> [a]

上面列表的定义不是有效的haskell-98,因为带有非字母数字字符的术语表示中缀函数,因此[]不能是常量数据构造函数。

第二个有争议的原因与(:)有关。在haskell 98中,我们可以使用 infix 数据构造函数,但它们必须以冒号开头。因此(:)是此规则的一种特殊情况。

添加了这种特殊语法,因此您可以获得类似(a:as)的漂亮模式匹配,以便空[]列表与其他特殊列表语法之间的对应关系看起来像[1,2,3]