2016-09-07 13 views
3

Für (->) haben wir:Was bedeuten Daten (->) a b?

Prelude> :i (->) 
data (->) t1 t2   -- Defined in ‘GHC.Prim’ 

Was diese Syntax bedeutet das? Ich dachte, das Datendeklarationsschlüsselwort benötigt einen Typkonstruktor auf der LHS und einen oder mehrere Wertkonstruktoren auf der RHS?

Und wie wird (->) allgemein gesprochen oder ausgesprochen?

+1

'(+) a b 'ist äquivalent zu' a + b 'auf der Ausdrucksebene. '(->) a b 'ist äquivalent zu' a -> b 'auf der Typenebene. Wenn Sie einen Infix-Ausdruck in Klammern schreiben, schreiben Sie ihn in ein Präfix. –

Antwort

11

(->) ist der Funktionstyp und die Leute sprechen ihn generell als "zu" aus (dh a -> b würde "a zu b" ausgesprochen).

(->) ist ein primitives Konstrukt, das in GHC integriert ist: der Compiler handhabt es speziell. einige Tools wie :i jedoch die sehen eine gefälschte Definition von (->) mit normalen Typen arbeiten, als ob es ein leerer Datentyp war:

data (->) a b 

Dies ermöglicht :i Sie Informationen über einen eingebauten in Betrieb zu geben, als ob es eine normale Definition.

Die (->) a b Syntax ist die Vorsilbe Version eines Infix Namen, so wie du normale Operatoren in Präfix Form definieren:

a ~+ b = a * b + b 

ist die gleiche wie

(~+) a b = a * b + b 

Wenn Sie definieren, tatsächlich versucht (->) Auf diese Weise erhalten Sie einen Fehler:

<interactive>:20:1-13: error: 
    Illegal binding of built-in syntax: (->) 

jedoch Sie können definieren leere Datentypen wie diese selbst, wenn Sie ihnen einen gültigen Namen geben:

data Foo a b 

Dies macht Foo ein Typ mit zwei (Phantom) Argumente, die keine Werte außer ⊥ hat, genau wie Void von Data.Void.

Wenn Sie mit der Infix Syntax spielen, um möchten, können Sie einen Typ Operator definieren mit der TypeOperators Erweiterung aktiviert, mit der gleichen Bedeutung wie Foo:

data a +~ b 

oder

data (+~) a b 

Diese könnte nützlich sein, wenn wir zum Beispiel OCaml emulieren und Paartypen wie a * b statt (a, b):

schreiben möchten
type a * b = (a, b) 
Verwandte Themen