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)
答案 0 :(得分:3)
我相信你的困惑的根源是这段话:
咖喱功能采用函数f a b
不是真的:curry
接受一个函数,该函数是f
。至于a
和b
,它们是传递给curried函数的参数。通过添加一对多余的括号,更容易看出,使部分应用更加明显......
(curry f) a b = f (a,b)
...或通过lambda将a
和b
移到右侧:
curry f = \a b -> f (a,b)
f
是一个成对的函数 - 请注意我们给它一对,(a,b)
。另一方面,curry f
分别取两个论点。既然如此,curry
的类型确实是:
curry :: ((a, b) -> c) -> (a -> b -> c)
答案 1 :(得分:1)
Curry只接受一个参数,它是一个函数并返回一个函数。该参数是带签名的函数
((a, b) -> c)
即。一个带有一个参数的函数:一对东西a和b并返回另一个东西c。库里为这个功能做了一些神奇的事情并把它变成了一个新功能:
(a -> b -> c)
即。一个带有两个参数的函数:一个东西和一个东西b并返回一个东西c。
所以代码:
curry f a b
就像:
let newFunction = curry(f)
newFunction a b
基本上,curry会将一对函数转换为一个函数,该函数将该对作为两个参数。