swift - Swift 中偏函数应用的有用示例是什么?

标签 swift functional-programming currying partial-application

我看到 Swift 为声明柯里化(Currying)函数提供了方便的语法。该手册以局部函数应用为例,说明柯里化(Currying)函数将派上用场。

有人能给我一个偏函数应用有用的例子吗?我知道这是一个通用的函数式编程概念,但非常感谢 Swift 中的示例。

最佳答案

假设您经常要检查一个数字 i 是另一个值的倍数。它可能是 of 的倍数可以改变,但是如何确定它的规则总是相同的:i % n == 0

你可以这样写一个函数:

func isMultipleOf(#n: Int, #i: Int) -> Bool {
    return i % n == 0
}

isMultipleOf(n: 2, i: 3)  // false
isMultipleOf(n: 2, i: 4)  // true

但是,也许您发现自己经常想将此函数与其他“高阶”函数一起使用——也就是说,将其他函数作为参数的函数,例如 mapfilter :

 let r = 1...10
 // use isMultipleOf to filter out the even numbers
 let evens = filter(r) { isMultipleOf(n: 2, i: $0) }
 // evens is now [2,4,6,8,10]

isMultipleOf 的使用看起来有点笨拙且难以阅读,所以也许您根据 isMultipleOf 定义一个新函数 isEven > 让它更清楚一点:

let isEven = { isMultipleOf(n: 2, i: $0) }
isEven(2)  // true
isEven(3)  // false
let evens = filter(r, isEven)

现在,假设您将 isMultipleOf 声明为一个柯里化(Currying)函数:

func isMultipleOf(#n: Int)(#i: Int) -> Bool {
    return i % n == 0
}

isMultipleOf 现在是一个接受数字 n 的函数,并返回一个接受数字并检查它是否是 n< 的倍数的新函数.

您现在可以使用它来声明 isEven,如下所示:

let isEven = isMultipleOf(n: 2)

或者您可以像这样直接使用过滤器:

let evens = filter(r, isMultipleOf(n: 2))
// just like before, evens is [2,4,6,8,10]

关于swift - Swift 中偏函数应用的有用示例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27839875/

相关文章:

ios - 使用 Swift4 JSONDecoder 解析 IOS FBSDKGraphRequest 结果

swift - 在 Swift 闭包中隐式使用 self

java - 函数式编程将代码转换为声明式风格

python - 在循环中使用 python 中的柯里化(Currying)函数

javascript - 使用函数柯里化(Currying)在 typescript 中构建实用程序类

ios - 如何将日期选择器的最短日期设置为从今天往前一个月

swift - 如何解决表达式类型不明确错误?

function - OCaml 递归函数应用一个函数 n 次

java - Java 相当于 Python 的 reduce 函数是什么?

ruby - 理解 Ruby 中 Proc.curry 方法的 arity 参数