如何理解 Swift 中的柯里化?
How to understand the currying in Swift?
我是Swift新手,看书的时候发现Swift中的currying比较复杂,所以我按照书上写的代码,比如:
func curry<A, B, C>(f: (A, B) -> C) -> A -> B -> C {
return { x in { y in f(x, y) } }
}
func paraFunc(pa: Int, pb: Int) -> Int {
return pa - pb
}
var cab = curry(paraFunc)
cab(2)(3)
而且我不知道如何理解“-> A -> B -> C”。我知道泛型。但我对 func curry 感到困惑,它是如何工作的?有人可以帮助我吗?
-> 运算符是右结合的。所以我们可以像这样重写 curry 函数。
func curry<A, B, C>(f: @escaping (A, B) -> C) -> ((A) -> ((B) -> C)) {
return { x in { y in f(x, y) } }
}
每个 (
与 return 部分内的 {
匹配。
编辑:进一步解释
curry
函数接受一个非柯里化的两个参数函数并使它柯里化。例如我们有:
func sum(a: Int, b: Int) -> Int {
return a + b
}
现在我们可以像这样使用这个函数:
let result = sum(3, 6)
但是如果我们把它咖喱化
let curriedSum = curry(sum)
现在我们可以这样使用它了:
let result = curriedSum(3)(6)
起初这似乎是不必要的和复杂的。但是想想下一个表达式的作用。
let sumWith3 = curriedSum(3)
这会产生一个新函数,它接受一个 Int
和 3 的总和。现在在这里我们从另一个函数创建了一个新函数。现在我们可以像使用任何其他函数一样使用它了。
柯里化是函数式编程中的常见范例。事实上,在 Haskell(另一种函数式编程语言)中,默认情况下每个函数都是柯里化的。
我是Swift新手,看书的时候发现Swift中的currying比较复杂,所以我按照书上写的代码,比如:
func curry<A, B, C>(f: (A, B) -> C) -> A -> B -> C {
return { x in { y in f(x, y) } }
}
func paraFunc(pa: Int, pb: Int) -> Int {
return pa - pb
}
var cab = curry(paraFunc)
cab(2)(3)
而且我不知道如何理解“-> A -> B -> C”。我知道泛型。但我对 func curry 感到困惑,它是如何工作的?有人可以帮助我吗?
-> 运算符是右结合的。所以我们可以像这样重写 curry 函数。
func curry<A, B, C>(f: @escaping (A, B) -> C) -> ((A) -> ((B) -> C)) {
return { x in { y in f(x, y) } }
}
每个 (
与 return 部分内的 {
匹配。
编辑:进一步解释
curry
函数接受一个非柯里化的两个参数函数并使它柯里化。例如我们有:
func sum(a: Int, b: Int) -> Int {
return a + b
}
现在我们可以像这样使用这个函数:
let result = sum(3, 6)
但是如果我们把它咖喱化
let curriedSum = curry(sum)
现在我们可以这样使用它了:
let result = curriedSum(3)(6)
起初这似乎是不必要的和复杂的。但是想想下一个表达式的作用。
let sumWith3 = curriedSum(3)
这会产生一个新函数,它接受一个 Int
和 3 的总和。现在在这里我们从另一个函数创建了一个新函数。现在我们可以像使用任何其他函数一样使用它了。
柯里化是函数式编程中的常见范例。事实上,在 Haskell(另一种函数式编程语言)中,默认情况下每个函数都是柯里化的。