【发布时间】:2017-04-25 02:03:29
【问题描述】:
curry f a b = f(a,b)
我想: curry 函数接受函数 f a b 并返回 f(a, b),所以我认为类型是:
(a -> b -> c) -> (a, b) -> c
那么为什么要反转类型呢?:
((a, b) -> c) -> (a -> b -> c)
【问题讨论】:
标签: haskell currying partial-application
curry f a b = f(a,b)
我想: curry 函数接受函数 f a b 并返回 f(a, b),所以我认为类型是:
(a -> b -> c) -> (a, b) -> c
那么为什么要反转类型呢?:
((a, b) -> c) -> (a -> b -> c)
【问题讨论】:
标签: haskell currying partial-application
我相信你困惑的根源是这段话:
curry 函数采用函数 f a b
并非如此:curry 接受一个函数,该函数是 f。至于a 和b,它们是传递给柯里化函数的参数。更容易看出,通过添加一对多余的括号,使部分应用更加明显......
(curry f) a b = f (a,b)
... 或者通过将 a 和 b 移动到右侧,使用 lambda:
curry f = \a b -> f (a,b)
f 是一个接受一对的函数——注意我们给了它一对 (a,b)。另一方面,curry f 分别采用两个参数。这样一来,curry 的类型确实是:
curry :: ((a, b) -> c) -> (a -> b -> c)
【讨论】:
Curry 只接受一个参数,它是一个函数并返回一个函数。该参数是一个带有签名的函数
((a, b) -> c)
即一个接受一个参数的函数:一对事物 a 和 b,并返回另一个事物 c。 Curry 对该函数做了一些神奇的事情,并将其变成了一个新函数:
(a -> b -> c)
即一个接受两个参数的函数:一个事物 a 和一个事物 b,并返回一个事物 c。
所以代码:
curry f a b
就像:
let newFunction = curry(f)
newFunction a b
基本上,curry 将一个接受一对的函数转换为一个接受该对作为两个参数的函数。
【讨论】: