问题
I try to understand the function currying tutorial but that code seem out of date. And it's still not really clear about function currying.
I try with this function:
func curry<A, B, C>(_ f: @escaping (A, B) -> C) -> (A) -> (B) -> C {
return { a in { b in f(a, b)} }
}
And it runs ok with Playground (Xcode 9 beta 6)
. But the problem is I cannot use this function as the tutorial:
let add = curry(+)
let xs = 1...100
let x = xs.map(add(2))
The code above return error:
Playground execution failed:
error: FunctionsCurrying.playground:31:17: error: ambiguous use of operator '+'
let add = curry(+)
^
Please correct me and help me to clear about function currying
.
回答1:
That problem is not Swift 4 related, you would get the same error message in Swift 3.
There are many overloaded +
operators, therefore in
let add = curry(+)
the compiler does not know which one to choose. With an explicit type cast
let add = curry((+) as ((Int, Int) -> Int))
or an explicit type annotation
let op: (Int, Int) -> Int = (+)
let add = curry(op)
the code compiles and runs as expected.
来源:https://stackoverflow.com/questions/46154375/how-to-use-function-currying-in-swift-4