Blog

Functional Snippet #2: Function Composition

In functional programming, we often want to combine multiple small, independent functions into a new function. For example, let's say we have a function for getting the contents of a URL, a function for turning a string into an array of lines, and a function for counting elements. We can compose those functions into a new function that counts the number of lines in a 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

							

Because function composition is such a common thing, functional programmers defined a custom operator for it.

								infix operator >>> { associativity :left }
func >>> <A, B, C>(f: (B )-> C, g: (A )-> B) -> (A )-> C {
    return { x in f(g(x)) }
}

							

Now, we can get rid of all the nested parentheses, and write our example like this:

								let linesInURL2 = countElements >>> lines >>> getContents
linesInURL2("http://www.objc.io/books") // Returns 470

							

Stay up-to-date with our newsletter or follow us on Twitter .

Back to the Blog

Recent Posts