Swift:你如何理解这个函数签名: func curry<A, B, C>(f: (A, B) -> C) -> A -> B -> C

标签 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)

最佳答案

这是一个采用 (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 来说是不可能的功能。

参见Wikipedia article on currying

关于Swift:你如何理解这个函数签名: func curry<A, B, C>(f: (A, B) -> C) -> A -> B -> C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26956494/

相关文章:

ios - 通过快速单击 TableView 单元格转到 ViewController

Swift GoogleMaps fitBounds Zoom

swift - 向 MKAnnotation 添加属性会出现 EXC_BAD_EXCESS 错误

未调用 UITableView 方法 cellForRowAtIndexPath

swift - UIStackView - 为什么堆栈一个放在另一个之上?

ios - Swift 4 中模板图像的渐变颜色

swift - 如何将 UIScrollView 的 panGestureRecognizer 添加到 Gesture Recognizer Collection

swift - 状态栏和导航栏似乎没有相同的颜色 iOS Swift

ios - 动画 Collection View 高度变化(Swift)

ios - UISegmentedControl 作为 UINavigationBar 标题项在一些延迟后加载