(->)
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)
'(+) 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. –