我注意到这两个定义无法在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 :
但为什么呢?是否有特殊原因可以挑出这个功能?
答案 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]
。