2011-09-30 67 views
1

我正在閱讀Chris Smith編程的F#,現在試圖找出F#,當我遇到Lambadas時。下面是其中一個例子拉姆達F#Lambda簽名

let generatePowerOfFunc base = (fun exponent -> base ** exponent);; 

我得到它需要的東西,並返回一個函數,但我不明白的是這個函數的簽名是val generatePowerOfFunc : float -> float -> float

如何它有三個花車而不是兩個?而當有這種方法

let powerOfTwo = generatePowerOfFunc 2.0;;

它只有2個漂浮val powerOfTwo : (float -> float)

也許我沒有得到整個類型簽名交易。任何幫助將非常感激。感謝

+0

另請參閱:http://lorgonblog.wordpress.com/2008/04/03/f-function-types-fun-with-tuples-and-currying/ – Brian

回答

3

除了kongo2002:

->鏈中的最後一個項目是return type另一種說法。第一個接受兩個浮點數並返回一個浮點數,第二個接受一個浮點數並返回一個浮點數。

這樣做,而不是像(float, float) : float這樣的想法是,你可以使用一個叫做「currying」的概念。 generatePowerOfFunc的類型爲float -> float -> float,相當於float -> (float -> float),所以我們可以給它一個浮點數並返回一個float -> float類型的函數(我們可以給它另一個浮點數並返回一個浮點數)。

這意味着當您致電generatePowerOfFunc 2. 4.時,您應用兩次。一旦申請2.,並且一旦申請4.

+0

忘了咖啡的東西。現在它變得更有意義。謝謝 –

2

功能generatePowerOfFunc採用float類型的兩個參數,並返回float值:

val generatePowerOfFunc : float -> float -> float 
//      ^^^^^^^^^^^^^^ 
//      arguments 
//           ^^^^^ 
//           return value 

功能powerOfTwo就像是一個局部函數的應用程序,只需要一個float參數(指數),並返回一個float

+0

我知道這很舊,但我仍然想要評論你的答案'generatePowerOfFunc'的不準確性不需要兩個參數。它需要一個。 OP很可能不熟悉FSI不會以更易讀的方式輸出簽名。簽名實際上是'val generatePowerOfFunc:float - >(float - > float)'。它將'float'作爲參數並返回一個帶有'float - > float'簽名的函數。這是基於OP編寫的內容。 – czifro