swiftの記事見てたらカリー化ってのがありました。
- なんですか?それは??
currying
カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること(あるいはその関数のこと)である。クリストファー・ストレイチーにより論理学者ハスケル・カリーにちなんで名付けられたが、実際に考案したのはMoses Schönfinkelとゴットロープ・フレーゲである。
ごく簡単な例として、f(a, b) = c という関数 f があるときに、F(a) = g(ここで、g は g(b) = c となる関数である)という関数 F が、f のカリー化である。
意味わかりません...食べるカレー(curry)とスペルが一緒ということはわかりました。
でもf(a,b)をF(a)とg(b)に分解するってのは、その21のとこで試しましたよ?
これのこと?
let add5 = { (x:Int) -> (Int -> Int) in
return { (y:Int) -> Int in x + y }
}
print(add5(1)) // (Function)
print(add5(1)(2)) // 3
- …で、だからなんなんでしょう??
どこが美味しいの?
- できるのはわかったんですが何が美味しいのかがよくわかりません...
こんなの試してみます。
let add = { (x:Int) -> (Int -> Int) in
return { (y:Int) -> Int in
x + y
}
}
var arr = [1, 2, 3, 4 ,5]
print( arr.map{add($0)}.map{$0(1)}.reduce(0, combine: {(a,b)->Int in a+b}) ) // 20
- 次の処理の引数に関数が渡せるんだ〜
map{$0(1)}
のところでは思いますが、特に美味しくありません...下のと一緒ですもんね。
こっちのほうが簡単じゃね?
var arr = [1, 2, 3, 4 ,5]
let add1 = { (x:Int,y:Int) -> Int in x + y }
print( arr.map{add1($0,1)}.reduce(0, combine: {(a,b)->Int in a+b}) ) // 20
- う〜〜む…
まとめ
- 理論的にはいろいろあるようですが、実際のプログラムでのメリットを教えて下さい…