【问题标题】:What is a useful example of partial function application in Swift?什么是 Swift 中偏函数应用的有用示例?
【发布时间】:2015-01-08 12:12:14
【问题描述】:

我看到 Swift 为声明柯里化函数提供了方便的语法。手册以部分函数的应用为例,说明柯里化函数的用处。

谁能给我一个部分函数应用程序有用的例子?我知道这是一个通用的函数式编程概念,但最好有一个 Swift 示例。

【问题讨论】:

  • 最常见的用途是重复查询某种容器。将查找函数应用于容器,命名该值,然后您可以以稍微便宜的成本重复应用它。

标签: swift functional-programming currying partial-application


【解决方案1】:

假设您经常要检查一个数字 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 的使用看起来有点笨拙且难以阅读,所以也许你可以定义一个新函数 isEven,以 isMultipleOf 的形式使其更清晰:

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

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

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]

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2014-08-22
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多