Почему встроен `(:)`?

Я замечаю, что эти два определения не могут быть найдены в самом официальном ресурсе документации Haskell:

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

Я проверил Hoogle и нет записей для data [] или (:). Эти две не должны быть "нормальной" функцией и типом данных?


Изменить. В 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  :  

Но почему? Есть ли особая причина для выделения этой функции?

Ответ 1

Это встроенный синтаксис, а не встроенная функция. Функция (:) является всего лишь одним из двух конструкторов встроенного типа []. Однако:

  • Имя типа [] недействительно синтаксис Haskell для имени типа; поэтому он должен быть встроенным синтаксисом.
  • Аналогично, синтаксис типа [a] для экземпляра [] - это встроенный синтаксис.
  • Имя другого конструктора [] недействительно синтаксис Haskell для имени конструктора; поэтому он должен быть встроенным синтаксисом.
  • Литеральный синтаксис списка [ x, y, z ] - это встроенный синтаксис (очевидно).

Поскольку по существу все остальное о типе [] является встроенным синтаксисом, было принято решение сделать также встроенный синтаксис :, вместо того, чтобы быть единственным исключением, которое фактически было действительным именем в язык.

Ответ 2

(:) не является нормальной функцией, но один из двух конструкторов данных в (не действительный Haskell 98) определение вы публикуемую ( Edit Я думаю, что спорно, так как это определение не является реальным синтаксис в любом случае...)

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

Но у него действительно есть тип, который вы отправили (:) :: a -> [a] -> [a]

Определение вышеперечисленных списков недействительно haskell-98, потому что термины с не-буквенно-цифровыми символами обозначают функции infix, поэтому [] не может быть постоянным конструктором данных.

Вторая, спорная причина связана с (:). В haskell 98 мы можем иметь инфиксные конструкторы данных, но они должны начинаться с двоеточия. Итак, (:) является своего рода частным случаем этого правила.

Этот специальный синтаксис был добавлен, чтобы вы могли получить хорошие совпадения шаблонов, такие как (a:as), и так, чтобы между пустым списком [] и другим синтаксисом специального списка, который выглядит как [1,2,3].