如何理解Swift中的currying?

问题描述 投票:2回答:1

我是Swift的新手,当我看书时,我发现Swift中的curry很复杂,我按照书中的说法编写代码,例如:

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”。我知道泛型。但我对咖喱咖喱感到困惑,它是如何运作的?任何人都可以帮助我?

swift currying
1个回答
2
投票

- >运算符是右关联的。所以我们可以像这样重写咖喱功能。

func curry<A, B, C>(f: @escaping (A, B) -> C) -> ((A) -> ((B) -> C)) {
  return { x in { y in f(x, y) } }
}

每个(都与返回部分内的{相匹配。

编辑:进一步解释

curry函数采用非curried两个参数函数并使其成为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相加。现在我们在这里从另一个函数创建了一个新函数。现在我们可以像任何其他功能一样使用它。

Currying是函数式编程中的常见范例。事实上,在Haskell(另一种函数式编程语言)中,默认情况下每个函数都是curry。

© www.soinside.com 2019 - 2024. All rights reserved.