什么是Swift中部分函数应用的有用示例?

时间:2015-01-08 12:12:15

标签: swift functional-programming currying partial-application

我看到Swift为声明curried函数提供了方便的语法。该手册给出了部分功能应用,作为curry功能派上用场的一个例子。

有人可以给我一个部分功能应用程序有用的例子吗?我知道这是一个通用的函数式编程概念,但是Swift中的一个例子将是最受欢迎的。

1 个答案:

答案 0 :(得分:5)

假设您经常要检查一个数字,i是另一个值的倍数。 的多个可能会发生变化,但如何确定它的规则始终相同: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:< / p>

 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,以使其更清晰:< / p>

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

现在,假设您将isMultipleOf稍微不同地声明为一个curried函数:

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]