我在《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)
最佳答案
这是一个采用 (A, B) -> C
类型参数的函数(即函数接受两个参数并返回一个)并返回 A -> B -> C
(即 A -> (B -> C)
即接受一个参数并返回函数 B -> C
的函数)。
柯里化(Currying)将两个参数函数“分解”为两个步骤。柯里化(Currying)两个参数函数会生成单参数函数,该函数返回另一个单参数函数。最后一个函数相当于绑定(bind)第一个参数的原始函数。
例如(伪代码,因为我不知道 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
来说是不可能的功能。
关于Swift:你如何理解这个函数签名: func curry<A, B, C>(f: (A, B) -> C) -> A -> B -> C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26956494/