我看到 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
但是,也许您发现自己经常想将此函数与其他“高阶”函数一起使用——也就是说,将其他函数作为参数的函数,例如 map
和 filter
:
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/