2015-09-02 12 views
15

ich feststellen, dass die diese beiden Definitionen nicht, wo in der die meisten offiziellen Ressource von Haskell Dokumentation gefunden werden:Warum ist `(:)` eingebaut?

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

Ich habe Hoogle und es gibt keine Einträge für data [] oder (:). Sollen diese beiden nicht "normale" Funktion und Datentyp sein?


bearbeiten: Im Haskell 2010 Language Report, sie sagen, dass

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

Aber warum? Gibt es einen besonderen Grund für diese Funktion?

Antwort

16

Es ist eingebaute in Syntax, nicht wirklich eine eingebaute in Funktion. Die Funktion (:) ist nur einer der beiden Konstruktoren des eingebauten Typs []. Allerdings:

  • Der Name des Typs, [], ist nicht gültig Haskell Syntax für eine Typname; also muss es eingebaute Syntax sein.
  • Ähnlich ist die Syntax [a] für eine Instanziierung von [] integrierte Syntax.
  • Der Name des anderen Konstruktors, [], ist keine gültige Haskell-Syntax für einen Konstruktornamen. also muss es eingebaute Syntax sein.
  • Die Liste Literal-Syntax [ x, y, z ] ist integrierte Syntax (offensichtlich).

Da im Wesentlichen alles andere über die Art [] eingebaut ist Syntax wurde die Entscheidung : sowie eingebauten Syntax zu machen gemacht, anstatt es die einzige Ausnahme sein, die die tatsächlich in der ein gültiger Name war Sprache.

+1

Seltsame Entscheidung, dass. – dfeuer

3

(:) ist keine normale Funktion, ist aber eine der beiden Daten Konstrukteuren in der (nicht gültig Haskell 98) Definition Sie auf dem Laufenden (bearbeiten Ich denke, das ist fraglich, da diese Definition sowieso nicht real Syntax ist ...)

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

Aber es hat in der Tat die Art Sie (:) :: a -> [a] -> [a] geschrieben

die Definition von Listen ist oben nicht gültig Haskell-98, weil Begriffe mit nicht-alphanumerischen Zeichen Infix Funktionen bezeichnen, so kann [] nicht ein konstante da ta Konstruktor. Der zweite, strittige Grund hat mit (:) zu tun. In haskell 98 können wir infix Datenkonstruktoren haben, aber sie müssen mit einem Doppelpunkt beginnen. So ist (:) eine Art Sonderfall dieser Regel.

Diese spezielle Syntax hinzugefügt wurde, so können Sie schöne Muster erhalten Spiele wie (a:as), und so, dass es die Übereinstimmung zwischen der leeren [] Liste und der anderen speziellen Liste Syntax, die wie [1,2,3] aussieht.

Verwandte Themen