あなたの仮定は正しいです。この場合、機能はまったく同じです。
これは、生成された IL コード (Craig によるデモ) を調べることで確認できます。また、F# コンパイラによって推論された型を調べることでも確認できます。どちらの場合も、 が表示されますint -> int -> int
。int
F# 言語では、これを受け取って返す関数と見なしますint -> int
が、実際には (効率のために) 複数の引数を持つメソッドとしてコンパイルされます。
fun
直後に記述let .. =
すると、コンパイラはそれを標準関数に変換します。ただし、関数を返す前に計算を行うと、少し異なるコードを書くことができます。
let f1 a b = printfn "hi"; a + b
let f2 a = printfn "hi"; (fun b -> a + b)
この 2 つの関数は非常に異なります。2 番目の関数は、引数を 1 つだけ指定すると "hi" を出力するためです (そして、呼び出すことができる関数を返します)。
> 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
を使用して同じコードを書くことができますf1
が、最初のコマンドは単に新しい関数を作成し、2 番目のコマンドは "hi" を出力して追加を行います。
この場合、生成される IL コードはf2
異なります。関数(タイプ) を返す関数になりますFSharpFunc<int, int>
。F# で表示される型も異なりint -> (int -> int)
ますint -> int -> int
。これら 2 つの型の値はまったく同じ方法で使用できますが、単一の引数を指定すると、最初の型が何らかの影響を与える可能性があることを示唆しています。