Junkor

函数组合(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