如何在Swift 4中使用函数currying

lee*_*lee 5 currying swift

我尝试理解函数currying教程但该代码似乎已过时.功能调整还不是很清楚.

我试试这个功能:

 func curry<A, B, C>(_ f: @escaping (A, B) -> C) -> (A) -> (B) -> C {
    return { a in { b in f(a, b)} }
}
Run Code Online (Sandbox Code Playgroud)

它运行正常Playground (Xcode 9 beta 6).但问题是我无法使用此功能作为教程:

let add = curry(+)
let xs = 1...100
let x = xs.map(add(2))
Run Code Online (Sandbox Code Playgroud)

上面的代码返回错误:

Playground execution failed:

    error: FunctionsCurrying.playground:31:17: error: ambiguous use of operator '+'
    let add = curry(+)
                    ^
Run Code Online (Sandbox Code Playgroud)

请指正,并帮我澄清一下function currying.

Mar*_*n R 9

那个问题不是Swift 4相关的,你会在Swift 3中得到相同的错误信息.

+因此,有许多重载运算符

let add = curry(+)
Run Code Online (Sandbox Code Playgroud)

编译器不知道选择哪一个.使用显式类型转换

let add = curry((+) as ((Int, Int) -> Int))
Run Code Online (Sandbox Code Playgroud)

或显式类型注释

let op: (Int, Int) -> Int = (+)
let add = curry(op)
Run Code Online (Sandbox Code Playgroud)

代码编译并按预期运行.

  • @lee:正如我所说,有很多重载的+运算符,它们的参数类型不同,例如`(Int,Int) - > Int`和`(Double,Double) - > Double`等等.使用`as ...`,您告诉编译器选择哪一个来解决歧义. (2认同)