Votre hypothèse est correcte, dans ce cas, les fonctions sont exactement les mêmes.
Vous pouvez voir cela en inspectant le code IL généré (comme démontré par Craig) et vous pouvez également voir cela en regardant le type déduit par le compilateur F #. Dans les deux cas, vous verrez int -> int -> int
. Le langage F # considère que comme une fonction qui prend int
et renvoie int -> int
mais il est en fait compilé comme une méthode avec plusieurs arguments (pour l'efficacité).
Si vous écrivez fun
immédiatement après let .. =
, le compilateur devient alors une fonction standard. Cependant, vous pouvez écrire du code qui est un peu différent si vous faites quelques calculs avant de retourner la fonction:
let f1 a b = printfn "hi"; a + b
let f2 a = printfn "hi"; (fun b -> a + b)
Maintenant, les deux fonctions sont très différentes, car la deuxième imprime « salut » quand vous lui donnez juste un seul argument (et il retourne une fonction que vous pouvez appeler):
> 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
vous pouvez écrire le même code en utilisant f1
, mais la première commande va simplement créer une nouvelle fonction et la deuxième commande imprimera « salut » et faites l'addition.
Dans ce cas, le code IL généré pour f2
sera différent. Ce sera une fonction qui retourne une fonction (de type FSharpFunc<int, int>
). Le type affiché par F # est également différent - il sera int -> (int -> int)
au lieu de int -> int -> int
. Vous pouvez utiliser les valeurs de ces deux types exactement de la même manière, mais cela vous indique que le premier peut faire des effets lorsque vous lui donnez un seul argument.
Cochez [ma réponse ici] (http://stackoverflow.com/questions/2175940/int-int-int-what-does-this-mean-in/2176428#2176428), pourrait vous aider à comprendre le différence –
J'ai augmenté la question pour contenir le 3ème cas d'une réponse. – hyde