Otávio’s blog

Function Currying in Objective-C

Function Currying and uncurrying have been extensively discussed since Apple introduced Swift last year. I won’t delve into this topic deeply because there are some great resources about it on the Internet.

But, briefly, what is currying? It’s a technique that transforms a function that takes several arguments into a sequence of functions, each with a single argument. The result is a chain of functions returning functions. It’s beautiful, it’s mathematics!

Below is a simple example in Swift:

func add(_ a: Int) -> (Int) -> (Int) -> Int {
    { b in { c in a + b + c } }
}

let addTwo = add(2)               // Int -> Int -> Int
let addFive = addTwo(3)           // Int -> Int
let result = addFive(4)           // 9

print("result = \(result)")       // result = 9

And the same example in Objective-C:

typedef NSInteger(^FuncInt2Int)(NSInteger);
typedef FuncInt2Int(^FuncInt2Int2Int)(NSInteger);

FuncInt2Int2Int(^add)(NSInteger) = ^FuncInt2Int2Int(NSInteger a) {
    return ^FuncInt2Int(NSInteger b) {
        return ^NSInteger(NSInteger c) {
            return a + b + c;
        };
    };
};

FuncInt2Int2Int addTwo = add(2);        // Int -> Int -> Int
FuncInt2Int addFive = addTwo(3);        // Int -> Int
NSInteger result = addFive(4);          // 9

NSLog(@"result = %ld", result);         // result = 9

The Swift version is minimal and elegant. But the Objective-C one has its charm, doesn’t it?