2017-04-25 43 views

回答

3

我相信你的困惑的來源是這樣一段話:

咖喱函數取函數f A B

不是真的:curry需要一個功能,這功能是f。至於ab,它們是傳遞給curried函數的參數。這是比較容易地看到,通過添加一對多餘的括號,以使局部應用更明顯...

(curry f) a b = f (a,b) 

...或通過用一個lambda移位ab到右手側:

curry f = \a b -> f (a,b) 

f是一個函數,一對 - 注意,我們給它一對,(a,b)。另一方面,curry f分別採用兩個參數。如此,curry的類型確實是:

curry :: ((a, b) -> c) -> (a -> b -> c) 
1

咖喱只接受一個參數,它是一個函數並返回一個函數。這樣的說法是與簽名

((a, b) -> c) 

即一個函數,它有一個參數的函數:一對事物a和b,並返回另一件事℃。庫裏確實有些不可思議該功能,並把它變成一個新的功能:

(a -> b -> c) 

即有兩個參數的函數:一件事和一件事b,並返回一個東西℃。

因此,代碼:

curry f a b 

是這樣的:

let newFunction = curry(f) 
newFunction a b 

基本上咖喱變換一個函數,它的一對成需要的是一對兩個參數,而不是一個函數。