我在本书 Swift中的函数编程一书中看到了这个函数,但我不明白这个函数签名,这个函数的返回类型是什么意思?
func curry<A, B, C>(f: (A, B) -> C) -> A -> B -> C
{
return { x in { y in f(x, y) } }
}
修改
这个功能是这样使用的吗?
fun add(a: Int, b: Int) -> Int {
return a + b
}
let curriedAdd = curry(add)
//to add 1 and 2
let resultOf1Plus2 = curriedAdd(1)(2)
答案 0 :(得分:2)
这是一个函数,它接受一个(A, B) -> C
类型的参数(即函数接受两个参数并返回一个参数)并返回A -> B -> C
(即A -> (B -> C)
即带有一个参数的函数并返回函数B -> C
)。
将两个参数函数“分解”为两个步骤。 Currying两个参数函数产生单个参数函数,该函数返回另一个参数函数。最后一个函数等同于第一个参数绑定的原始函数。
例如(在伪代码中,因为我不知道Swift):
有:
f: (X,Y) -> Z
cf = curry(f)
对于任何f(x,y)
,cf(x)(y)
应相当于x,y
。
在您的示例中,resultOf1Plus2
应该会产生3.但是,您可以在中间“拆分”流程,然后调用
let increment = curriedAdd(1)
increment(2) // 3
increment(5) // 6
let addFive = curriedAdd(5)
addFive(5) // 10
使用普通add
函数无法实现。
答案 1 :(得分:1)
curry
接受一个函数,它接受一对A和B的参数并返回C.
它以这样一种方式包装这个函数:curry
的结果是一个函数,它接受一个类型为A的参数并返回另一个函数。另一个函数接受一个B类型的参数,并返回一个C.
效果是,之前您必须同时向原始函数提供A和B参数,使用curried版本,您可以首先提供A参数,并将结果与捕获的A值一起存储,然后在以后提供B参数。
答案 2 :(得分:0)
具有两个参数的函数并且具有一个参数的函数的'等效'可以返回一个参数的函数。
从一个返回的能力定义了所谓的同构。
最后
curry . uncurry
保留一个参数的函数,给出一个参数的函数不变
uncurry . curry
保留两个参数未触及的函数