在理解类型方面需要帮助(基于 curry)

Need help in understanding types (based on curry)

 curry f a b = f(a,b)

我想: curry 函数采用函数 f a b 和 returns f(a, b),所以我认为类型是:

(a -> b -> c) -> (a, b) -> c

那么为什么类型是反的呢?:

((a, b) -> c) -> (a -> b -> c)

Curry 只接受一个参数,它是一个函数,returns 一个函数。该参数是一个带有签名

的函数
((a, b) -> c)

即一个接受一个参数的函数:一对事物 a 和 b 以及 returns 另一事物 c。 Curry 对该函数做了一些神奇的事情,并将其变成了一个新函数:

(a -> b -> c)

即一个接受两个参数的函数:一个东西 a 和一个东西 b 和 returns 一个东西 c。

所以代码:

curry f a b

就像:

let newFunction = curry(f)
newFunction a b

基本上,curry 将一个接受一对的函数转换为一个接受该对作为两个参数的函数。

我相信您困惑的根源是这段话:

the curry function takes function f a b

不是真的:curry 有一个函数,那个函数是 f。至于 ab,它们是传递给柯里化函数的参数。更容易看出,通过添加一对多余的括号,使部分应用更加明显...

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

... 或者通过将 ab 移到右侧,使用 lambda:

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

f 是一个接受一对的函数——注意我们给它一对,(a,b)。另一方面,curry f 分别接受两个参数。既然如此,curry的类型确实是:

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