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で書く意味?ないよそんなもん。