为什么`(:)`内置?

xzh*_*zhu 15 haskell

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

(:) :: a -> [a] -> [a]
data [] a = [] | a : []
Run Code Online (Sandbox Code Playgroud)

我检查过Hoogle并且没有条目data [](:).这两个不应该是"正常"功能和数据类型吗?


编辑:在Haskell 2010语言报告中,他们说

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

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

Jon*_*ast 16

它是内置语法,而不是内置函数.该函数(:)只是内置类型的两个构造函数之一[].然而:

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

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