curry f a b = f(a,b)
心想: 咖喱函数取功能晶圆厂,并返回F(A,B),所以我想类型是:了解各类需要帮助的(基于咖喱)
(a -> b -> c) -> (a, b) -> c
所以为什么类型被颠倒?:
((a, b) -> c) -> (a -> b -> c)
curry f a b = f(a,b)
心想: 咖喱函数取功能晶圆厂,并返回F(A,B),所以我想类型是:了解各类需要帮助的(基于咖喱)
(a -> b -> c) -> (a, b) -> c
所以为什么类型被颠倒?:
((a, b) -> c) -> (a -> b -> c)
我相信你的困惑的来源是这样一段话:
咖喱函数取函数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)
咖喱只接受一个参数,它是一个函数并返回一个函数。这样的说法是与签名
((a, b) -> c)
即一个函数,它有一个参数的函数:一对事物a和b,并返回另一件事℃。库里确实有些不可思议该功能,并把它变成一个新的功能:
(a -> b -> c)
即有两个参数的函数:一件事和一件事b,并返回一个东西℃。
因此,代码:
curry f a b
是这样的:
let newFunction = curry(f)
newFunction a b
基本上咖喱变换一个函数,它的一对成需要的是一对两个参数,而不是一个函数。