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