2016-05-02 3 views
0

Für (int -> int) -> int = <fun> kann der entsprechende Ausdruck fun x -> (x 1) + 1 sein.
Ist es möglich, einen Ausdruck mit int -> (int -> int) = <fun> Typ zu haben? Wenn nicht, warum?Ist es möglich, einen Ausdruck mit dem Typ "int -> (int -> int) = <fun>" zu haben?

+0

Streng genommen 'int -> (int -> int) = ' kein Typ ist, nur die 'int -> (int -> int)' Teil. Der '= ' Teil ist, wie ein Toplevel den" Wert "einer Funktion ausgibt. Zum Beispiel, nach der Auswertung von '1 + 1 ;;' utop wird '-: int = 2 'ausgeben, wobei' int 'der Typ des Ausdrucks und der Teil nach' = 'sein Wert ist. –

Antwort

0

Ist es möglich, einen Ausdruck mit int -> (int -> int) Typ haben?

Weil -> ist rechtsassoziativ, die Art int -> (int -> int) = int -> int -> int, obwohl die Klammern angedeutet sind. Die Funktion, nach der Sie suchen, ist eine einfache Curry-Funktion, die zwei Argumente benötigt, z.

let f x y = x + y 
0

Ja, natürlich. Sie müssen nur eine Funktion als Wert zurückgeben. Zum Beispiel:

let f j = fun i -> j + i;; 
val f : int -> int -> int = <fun> 

f 1;; 
- : int -> int = <fun> 

(f 1) 2;; 
- : int = 3 
+0

Keine verwandte Frage, aber sollen utop und toplevel in diesem Fall keine Klammern setzen wie nach der Auswertung von 'fun x -> (x 1) + 1'? – alr

+0

@AlexanderRevyakin Der Toplevel verwendet die Regel, dass der Pfeil ('->') in den Typen rechts assoziert, und spart unnötige Klammern. –

Verwandte Themen