2011-10-10 86 views
0

這兩個是等效的:F#:定義函數的兩種方法?

let f(x) = 
    10 

let g = fun(x) -> 
    10 

我覺得呢?他們似乎也做同樣的事情,但是有沒有兩種行爲會有所不同的情況?我發現第二個版本很有用(即使更詳細),因爲您可以使用<|<<運算符來實現python樣式修飾器模式;有沒有什麼情況下我使用第一個版本?另外,我完全理解第二個是如何工作的(右邊的東西只是一個函數表達式,我把它轉換成g),但第一個如何?是否有一些編譯器技巧或特殊情況將該語法從簡單賦值語句轉換爲函數定義?

+0

f <|事情//這也是第一個版本。 – BLUEPIXY

回答

3

正如布萊恩已經回答的那樣,兩者是相同的。返回fun而不是使用let聲明函數會使返回函數之前做某些事情(即某些初始化)有所不同。

例如,如果你想創建功能,增加了隨機數,你可以寫:

let f1 x = 
    let rnd = new System.Random() 
    x + rnd.Next() 

let f2 = 
    let rnd = new System.Random() 
    fun y -> y + rnd.Next() 

這裏,函數f1創建新Random例如,它每次執行,但f2使用相同的實例rnd所有的時間(所以f2是更好的寫作方式)。但是,如果立即返回fun,那麼F#編譯器會優化代碼,並且這兩種情況是相同的。

4

它們是等價的(模值'數值限制',它允許函數但不是值,是通用的,例如參見here)。