我看到Swift为声明curried函数提供了方便的语法。该手册给出了部分功能应用,作为curry功能派上用场的一个例子。
有人可以给我一个部分功能应用程序有用的例子吗?我知道这是一个通用的函数式编程概念,但是Swift中的一个例子将是最受欢迎的。
答案 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
但是,您可能会发现自己经常想要将此函数与其他“高阶”函数一起使用 - 即将其他函数作为参数的函数,例如map
和filter
:< / 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]