2015-05-04 4 views
5

Im Haskell 98 report, fand ich diese:Haskell: Warum sind keine Konstruktoren vom Typ Infix erlaubt?

Die Syntax für Ausdrücke Haskell Typ oben gegeben ist. So wie Datenwerte mit Datenkonstruktoren erstellt werden, werden Typwerte aus Typkonstruktoren erstellt. Wie bei Datenkonstruktoren beginnen die Namen von Typkonstruktoren mit Großbuchstaben. Im Gegensatz zu Datenkonstruktoren sind Infix-Typ-Konstruktoren nicht erlaubt (außer (->)).

keine Gründe, warum Infix Typkonstruktoren nicht erlaubt sind gegeben. In Agda und dergleichen sind Infix-Konstruktoren üblich. Warum nicht in Haskell?

+2

Haskell richtig kann es nicht zulassen, aber GHC hat Erweiterungen, die https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/data-type-extensions.html – jamshidh

Antwort

10

Es ist nicht Teil des Haskell-Standards, aber als jamshidh erwähnt, ist es immer noch in GHC möglich. Der Nachteil ist, dass Daten Bauer (nicht Konstrukteuren Typ) mit einem Doppelpunkt beginnen muss:

{-# LANGUAGE TypeOperators #-} 

data a + b = a :+ b 

f :: a + b -> a 
f (a :+ b) = a 

g :: a + b -> b 
g (a :+ b) = b 
+4

Sie nicht benötigen um 'TypeOperators' für den Infix-Konstruktor mit': 'zu aktivieren, kann aber' data A ab = a:> b abgeleitete Show' geschrieben werden – Michael

4

Nur um ganz klar: Haskell 98 und Haskell 2000 sowohl Infix Wert Konstrukteuren wie

data Complex r = r :+ r 
erlauben

Hier ist der Wertkonstruktor (:+) Infix, wie in 5 :+ 7.

Sie benötigen nur die TypeOperators Erweiterung, um Typ Konstruktoren, die Infix sind. Zum Beispiel

data x ??! y = Left x | Right y 

Hier ist der Typkonstruktor (??!) ist Infix, wie in Int ??! Bool.