Sunday, May 20, 2012

カリー化と部分適用

カリー化と部分適用の違いのメモ。
三つの変数を取って値を返す関数fを

f: X,Y,Z → V

として、カリー化や部分適用した後の関数をgとしたときに、
それぞれgは下記のようになる、と。

  • カリー化
    • g: X → (Y → (Z → V))
  • 部分適用(Yを固定する場合)
    • g: X, Z → V

fをカリー化したgだったら、Vを得るまでに、引数Xを一つ与えて返り値として関数を得て、その関数に次の引数Yを与えて…と、一つの引数をとる関数をチェーンした形で呼び出すようになる。部分適用みたいに引数が固定された状態にはならない。gを呼び出してVを得るまでに、X、Y、Zの三つの値を決めなければならない。

fに部分適用を施したgだったら、fのいくつかの引数の値が固定されて、fに比べてgは引数の数が減る。カリー化したgみたいに関数をチェーンして呼びだすなんて出来ない。gを呼び出してVを得るまでにはXとZの二つの値を決めなければならない。


部分適用は日頃ばんばん使いまくってるけど、カリー化はどういうケースで使うんだろう。
カリー化すると部分適用しやすくなるとか、"複数の引数をとる関数を、一つの引数のみを取る複数の関数のラムダ計算などの単純な理論的モデルと見なして研究できるようになる"とのこと(参考: http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)なので、カリー化は理論寄りのツールであって、単にコードを書く場合は「ここでこの関数をカリー化して」なんていう場面はあまりないのかも。
(カリー化するとこんな風にすっきり書ける、っていうテクニックがもしかしたらあるのかもしれないけど。)

だもんで、prototype.jsのFunction#curryはあまり適当ではないと感じる(部分適用のメソッド名はpartiallyApplyとかになるのかな)。
けどまぁcurryって書く方に慣れちゃってるし、タイプ数も少ないし、curryでいいnうわなにをするやめくぁwせdrftgyふじこlp;「’」

No comments: