L'ipotesi è corretta, in questo caso le funzioni sono identiche.
Si può vedere che ispezionando il codice IL generato (come dimostrato da Craig) e si può anche vedere che guardando il tipo inferito dal compilatore F #. In entrambi i casi, vedrai . Il linguaggio F # visualizza tale funzione come una funzione che prende int
e restituisce int -> int
ma in realtà viene compilata come metodo con più argomenti (per l'efficienza).
Se si scrive fun
immediatamente dopo let .. =
, il compilatore lo trasforma in una funzione standard. Tuttavia, è possibile scrivere codice che è un po 'diverso se si fa qualche calcolo prima di tornare alla funzione:
let f1 a b = printfn "hi"; a + b
let f2 a = printfn "hi"; (fun b -> a + b)
Ora le due funzioni sono molto diversi, in quanto il secondo stampe "Hi" quando si danno solo un singolo argomento (e quindi restituisce una funzione che si può chiamare):
> 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
è possibile scrivere lo stesso codice utilizzando f1
, ma il primo comando sarà solo creare una nuova funzione e il secondo comando stamperà "hi" e fare l'aggiunta.
In questo caso, il codice IL generato per f2
sarà diverso. Sarà una funzione che restituisce una funzione (di tipo FSharpFunc<int, int>
). Anche il tipo visualizzato da F # è diverso: sarà int -> (int -> int)
anziché int -> int -> int
. Puoi usare i valori di questi due tipi esattamente nello stesso modo, ma ti suggerisce che il primo potrebbe fare alcuni effetti quando gli dai un singolo argomento.
fonte
2012-10-30 13:05:46
Controllare [la mia risposta qui] (http://stackoverflow.com/questions/2175940/int-int-int-what-does-this-mean-in-f/2176428#2176428), potrebbe aiutare a capire il differenza –
Ho aumentato la domanda per contenere il terzo caso da una risposta. – hyde