函数组合(Function Composition)
文章翻译自objc,原文连接:『Function Composition』
在函数式编程中,我们习惯于把一些小的、独立的函数,组合成新的函数。假设我们有一个获取指定URL内容的函数、一个把字符串按换行拆分到数组的函数和一个计算元素个数的函数。我们可以把这些函数组合成一个统计指定URL内容行数的函数出来:
func getContents(url: String) -> String {
return NSString(contentsOfURL: NSURL(string: url),
encoding: NSUTF8StringEncoding, error: nil)
}
func lines(input: String) -> [String] {
return input.componentsSeparatedByCharactersInSet(
NSCharacterSet.newlineCharacterSet())
}
let linesInURL = { url in countElements(lines(getContents(url))) }
linesInURL("http://www.objc.io") // Returns 731
由于函数组合在函数式编程中太常用了,开发者们自定义了一个操作符来完成这件事:
infix operator >>> { associativity left }
func >>> <A, B, C>(f: B -> C, g: A -> B) -> A -> C {
return { x in f(g(x)) }
}
现在,我们可以摆脱所有的嵌套语句了,重写上面的例子:
let linesInURL2 = countElements >>> lines >>> getContents
linesInURL2("http://www.objc.io/books") // Returns 470