読者です 読者をやめる 読者になる 読者になる

定食屋おろポン

おろしポン酢と青ネギはかけ放題です

Objective-CのBlocksでカリー化関数と部分適用

すごいH本を少しずつ読み進めているんだけど、なかなか進まない。iOS6の新APIの調査の方に時間を取られています*1
5章くらいまで読んでるところだが、カリー化の説明がサラッと終わって消化不良なので、Objective-C*2で書いてみた。

multiplyThree(2)(3)(4)

で、2,3,4を引数に取り、2*3*4を返します。

typedef int (^multiplyBlk)(int);
typedef multiplyBlk (^multiplyTwoBlk)(int);
typedef multiplyTwoBlk (^multiplyThreeBlk)(int);

multiplyThreeBlk multiplyThree = ^multiplyTwoBlk(int x) {
    multiplyTwoBlk multiplyTwo = ^multiplyBlk(int y){
        multiplyBlk multiply = ^(int z){
            return x * y * z;
        };
        return multiply;
    };
    
    return multiplyTwo;
};

NSLog(@"%d", multiplyThree(2)(3)(4));
// => 24

部分適用もできます。

multiplyTwoBlk multiplyTwoBy5 = multiplyThree(5);

NSLog(@"%d", multiplyTwoBy5(6)(7));
// => 210

確かHaskellだとこんな感じ

multiplyThree :: Num a => a -> a -> a
multiplyThree x y z = x * y * z

Haskellなら2行で済むものを、わざわざObjective-Cで書く意味?ないよそんなもん。

*1:時間は作るものですよねorz

*2:正確にはCだけど