Ihre Annahme ist richtig, in diesem Fall sind die Funktionen genau gleich.
Das können Sie sehen, indem Sie den generierten IL-Code untersuchen (wie von Craig gezeigt), und Sie können das auch sehen, wenn Sie sich den vom F # -Compiler abgeleiteten Typ ansehen. In beiden Fällen sehen Sie int -> int -> int
. Die F # -Sprache sieht das als eine Funktion an, die int
nimmt und int -> int
zurückgibt, aber sie wird tatsächlich als eine Methode mit mehreren Argumenten (für Effizienz) kompiliert.
Wenn Sie fun
sofort nach let .. =
schreiben, verwandelt der Compiler das in eine Standardfunktion. Allerdings können Sie Code schreiben, der ein bisschen anders ist, wenn Sie vor der Rückkehr in die Funktion eine Berechnung tun:
let f1 a b = printfn "hi"; a + b
let f2 a = printfn "hi"; (fun b -> a + b)
Nun werden die beiden Funktionen sind sehr unterschiedlich, weil die zweite druckt „hallo“, wenn Sie es nur geben ein Argument (und dann gibt er eine Funktion, die Sie aufrufen können):
> let f = f2 1;;
hi // The body is called, prints
val f : (int -> int) // and returns function
> f 2;; // This runs the body of 'fun'
val it : int = 3 // which performs the additiion
Sie können den gleichen Code schreiben f1
verwenden, aber der erste Befehl wird nur eine neue Funktion erstellen und der zweite Befehl druckt „hallo“ und mach die Addition. In diesem Fall wird der generierte IL-Code für f2
unterschiedlich sein. Es wird eine Funktion sein, die eine Funktion (vom Typ FSharpFunc<int, int>
) zurückgibt. Der von F # angezeigte Typ ist auch anders - es wird int -> (int -> int)
statt int -> int -> int
sein. Sie können die Werte dieser beiden Typen auf die gleiche Weise verwenden, aber es weist darauf hin, dass der erste einige Auswirkungen hat, wenn Sie ihm ein einzelnes Argument geben.
Überprüfen Sie [meine Antwort hier] (http://stackoverflow.com/questions/2175940/int-int-int-what-does-this-mean-in-f/2176428#2176428), könnte Ihnen helfen, das zu verstehen Unterschied –
Ich erweiterte die Frage, um 3. Fall von einer Antwort zu enthalten. – hyde