Swift:你如何理解这个函数签名:func curry <a,b,=“”c =“”>(f:(A,B) - &gt; C) - &gt; A - &gt; B - &gt; ç</A,>

时间:2014-11-16 11:40:02

标签: swift

我在本书 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)

3 个答案:

答案 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函数无法实现。

请参阅Wikipedia article on currying

答案 1 :(得分:1)

curry接受一个函数,它接受一对A和B的参数并返回C. 它以这样一种方式包装这个函数:curry的结果是一个函数,它接受一个类型为A的参数并返回另一个函数。另一个函数接受一个B类型的参数,并返回一个C.

效果是,之前您必须同时向原始函数提供A和B参数,使用curried版本,您可以首先提供A参数,并将结果与​​捕获的A值一起存储,然后在以后提供B参数。

答案 2 :(得分:0)

具有两个参数的函数并且具有一个参数的函数的'等效'可以返回一个参数的函数。

从一个返回的能力定义了所谓的同构。

最后

curry . uncurry保留一个参数的函数,给出一个参数的函数不变 uncurry . curry保留两个参数未触及的函数