2017-04-25 40 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 

基本上咖喱变换一个函数,它的一对成需要的是一对两个参数,而不是一个函数。