Rubyではcurry化する方が難しいのだけれど。
Rubyの関数合成で調べれば延々と結果が出てくるので私のcodeを信用しないやうに。
cf. 「関数型Ruby」という病(2) - 関数合成 Proc#compose - ( ꒪⌓꒪) ゆるよろ日記 http://yuroyoro.hatenablog.com/entry/2012/08/09/203959
cf. 「関数型Ruby」という病(3) - カリー化(Proc#curry, Proc#flip) - ( ꒪⌓꒪) ゆるよろ日記 http://yuroyoro.hatenablog.com/entry/2012/08/10/232443
cf. 「関数型Ruby」という病(6) - 関数合成と文脈、Proc#liftとProc#>=、そしてモナ - ( ꒪⌓꒪) ゆるよろ日記 http://yuroyoro.hatenablog.com/entry/2014/02/17/100527
# license: Public Domain # @param [(Proc|lambda)[]] *fs # @return [Proc] def compose *fs; proc{|*args| fs.inject(args){|args, f| f.call *args } }; end
戻り値の個数と、次の関数の引数の個数が一致してれば合成できる。折角curry化してない世界なので、複数の関数を一気に合成できる。curry化された世界では、関数合成する関数もcurry化されてゐるべきだから。
compose( ->(n){ [n, n + 1] }, ->(n, m){ [n * 2, m] }, ->(n, m){ n + m } ).(8) # => 25
cf. アリティ付きフラット・ラムダ計算 (1) - 檜山正幸のキマイラ飼育記 http://d.hatena.ne.jp/m-hiyama/20130902/1378078580
cf. アリティ付きフラット・ラムダ計算 (2):モジュールの概要 - 檜山正幸のキマイラ飼育記 http://d.hatena.ne.jp/m-hiyama/20130903/1378178593
cf. ラムダ計算について2013年に思うこと - 檜山正幸のキマイラ飼育記 http://d.hatena.ne.jp/m-hiyama/20130904/1378255365