2012-07-03 22 views
5

Warum wird der Typ eines Plus (+) als int -> int -> int im Gegensatz zu (int * int) -> int betrachtet? Für mich macht der zweite Sinn, weil er ein 2-Tupel (die Summanden) "akzeptiert" und eine einzige int (ihre Summe) zurückgibt.OCaml-Typ des Plusoperators

Vielen Dank!

Antwort

11

Sie können eine Sprache erstellen, in der (+) den Typ (int * int) -> int hat. In der Tat funktioniert SML genau so. Es betrifft nur die Bedeutung von Infix-Operatoren. Die OCAML-Konventionen befürworten jedoch stark die Verwendung von Curry-Funktionen (vom Typ a -> b -> c) anstelle von uncurried-Funktionen. Ein schönes Ergebnis ist, dass Sie sie teilweise anwenden können. Zum Beispiel ((+) 7) ist ein aussagekräftiger Ausdruck vom Typ int -> int. Ich finde diese Notation sehr nützlich.

+1

Können Sie erklären, indem ((+) 7) vom Typ int-> int ist? Das verwirrt mich. Wie geht es von Int zu Int? –

+1

Die kurze Antwort ist, dass es eine Funktion ist, die 7 hinzufügt, was auch immer Sie ihm geben. Es ist äquivalent zu "Spaß x -> x + 7". Für eine längere Antwort kann ich meine Antwort oben bearbeiten, wenn Sie möchten. –

+0

@ JeffreyScofield: Nun, technisch ist es gleichbedeutend mit "Spaß x -> 7 + x", aber hier ist es das gleiche – newacct

2

Das mag ein wenig nicht hilfreich erscheinen, aber es ist, weil die Funktion zwei Argumente benötigt.

Wenn eine Funktion ein Tupel verwendet, wird ein einzelnes Argument verwendet.

Da (+) eine Inline-Funktion ist, wäre die Verwendung eines einzelnen Arguments nicht sinnvoll, da es wie + (1,2) im Gegensatz zu 1 + 2 aussehen würde.

Verwandte Themen