我想用 Swift 写一个翻转方法。
这是签名。
序曲> :t flip
翻转::(a -> b -> c) -> b -> a -> c
我在 Swift 中的代码:
func flip1<A, B, C>(f: A->B->C) -> (B->A->C) {
return { (valueB: B, valueA: A) in
return f(valueA, valueB)
}
}
func flip2<A, B, C>(f: A->B->C) -> (B->A->C) {
return { (valueB: B) in
return { (valueA: A) in
return f(valueA)(valueB)
}
}
}
flip1
方法无法编译。 return f(valueA, valueB)
行出现错误 Extra argument in call
flip2
方法工作正常,除了 flipped 方法只能像这样调用 method(1)(2)
。
如何编写 flip
方法以便我可以使用像 method(1, 2)
和 method(1)(2)
?
最佳答案
A->B->C
是一种接受一个 A
类型参数的函数类型
并返回一个函数 B->C
(一个“curried”函数)。函数类型
两个参数是 (A, B)->C
:
func flip<A, B, C>(f: (A, B)->C) -> (B, A)->C {
return { (valueB: B, valueA: A) in
return f(valueA, valueB)
}
}
let x = flip(-)(10, 5)
println(x) // -5
可以稍微缩短为
func flip<A, B, C>(f: (A, B)->C) -> (B, A)->C {
return { (valueB, valueA) in
f(valueA, valueB)
}
}
由于自动类型推断。
据我所知,Swift不会自动转换函数 将多个参数带入柯里化(Currying)函数,比较 Typecase regular Swift function to Curry Function .
关于swift - 如何在 Swift 中编写翻转方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30593940/