2014-05-19 47 views
0

w.r.t柯里斯卡拉,部分我理解下面的示例代碼。柯達在斯卡拉

def product1(f:Int => Int)(a:Int, b:Int):Int = { 
     println() 
     if(a > b) 1 
     else 
     f(a) * product1(f)(a+1, b) 
     } 

product(x => x * x) (3, 4) 

出來的,我與

產品1(F)

product1(f)(a+1, b) 

有點糊塗只是需要解釋發生的事情在這裏。 ... :(以及如何在解釋時口頭髮音...

在此先感謝..

+1

無數次,多個參數列表都與* currying無關*! –

+2

我的意思是,我不會說*沒有* – acjay

回答

3

product1有兩個參數列表。 product1(f)f的應用,其是種類Int => Int的功能。如果你僅僅調用product1(f)像這樣:

product1(f) 

沒有第二個參數列表,你會得到一個所謂的部分應用的功能,即一個函數,它不具有所有參數的約束(你仍然需要提供它ab

0

看參數聲明:

f:Int => Int 

f是一個Int映射到一個int功能 - 它需要一個int參數,並返回一個int。舉例如下:

x => x * x 

返回其參數的平方。

product1(x => x * x) (3, 4) 

返回f的產物(3).. F(4)= 3 * 3 * 4 * 4

順便說一句,這是不是真的討好的一個例子,由於所有的參數都是給出。鑽營會像

VAL prodSquare =產品1(X => X * X)

然後,

prodSquare(1, 5) 

產量1 * 1 * 2 * 2 * 3 * 3 * 4 * 4 * 5 * 5

0

對於我見過的大多數習慣用途,你也可以想象你的函數只有一個參數列表。多個參數列表主要用於泛型函數中的類型推斷目的,因爲類型推斷一次完成一個參數列表,而不是使用Hindley-Milner/Algorithm W一次推斷所有類型。其他一些語言特性適用於單個參數列表,例如implicit參數和隱式使用大括號代替單參數列表的括號等。

具有多個參數列表的函數以類似於咖喱的方式調用函數從語法的角度來看,但是默認情況下,中間函數不會被創建。在完全curried風格中,每個函數最多隻有一個參數,並返回一個結果(可能碰巧是另一個函數,需要參數等等)。從技術上講,討好的功能是:

def product2(f: Int => Int): Int => Int => Int = { 
    a: Int => { 
    b: Int => { 
     if(a > b) 1 
     else f(a) * product2(f)(a+1)(b) 
    } 
    } 
} 

爲了完整起見,你可以通過一個完整的參數列表之後使用下劃線治療有多個參數列表作爲咖喱函數的函數。在你最初的例子中,你會做product1(f)_,它會返回一個(Int, Int) => Int類型的函數。

在研究這個問題時,我發現another SO question值得檢查以更好地理解該語言的這一方面。