你的假設是正確的,在這種情況下,功能是完全一樣的。
通過檢查生成的IL代碼(由Craig演示),您可以看到通過查看F#編譯器推斷的類型,您可以看到該代碼。在這兩種情況下,您都會看到int -> int -> int
。 F#語言將這個函數作爲一個函數,它需要int
並返回int -> int
,但它實際上被編譯爲一個具有多個參數的方法(以提高效率)。
如果您在let .. =
之後立即編寫fun
,則編譯器將其轉換爲標準函數。但是,你可以,如果你返回功能之前,做一些運算編寫的代碼是有點不同:
let f1 a b = printfn "hi"; a + b
let f2 a = printfn "hi"; (fun b -> a + b)
現在,這兩個功能有很大的不同,因爲第二個打印「喜」當你給它只是一個一個參數(然後返回,你可以調用一個函數):
> 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
相同的代碼,但是第一個命令將剛剛創建一個新功能,第二個命令將打印「喜」並進行添加。
在這種情況下,生成的f2
的IL代碼將有所不同。這將是一個函數,返回函數(類型FSharpFunc<int, int>
)。 F#顯示的類型也不同 - 它將是int -> (int -> int)
而不是int -> int -> int
。你可以用完全相同的方式使用這兩種類型的值,但它暗示你第一個可能會給你一個單一的參數。
檢查[我的答案](http://stackoverflow.com/questions/2175940/int-int-int-what-does-this-mean-in-f/2176428#2176428),可以幫助你瞭解差異 –
我增加了問題以包含來自答案的第三個案例。 – hyde