Rubyにおける本格的な関数合成については、既に@yuroyoroさんのlambda_driver.gem があるので、僕の出番はありませんが。まあいつもの様にふざけたものなら出せますよ、ということで…。

ProcCompressor

こういった実装です。

使い方

使い方はこうです。

最初に圧縮するProcの数を決めてインスタンスを生成し、これにProcCompressor#<<でProcオブジェクトを順次圧縮していきます。

pc = ProcCompressor.new(2)

pc << ->n{ n * 2 } << ->n{ n + 5 }

で、最後に値を同じく#<<を使って投げれば、結果が得られます。

pc << 3 # => 11

Procのセットも結果の取得も、同じ#<<メソッドで達成できるところがアピールポイントです(何の価値があるかわかりませんが)。同じ入口に計算要素をどんどんpushしていくと最後に結果がpopするというイメージです。これはinjectでProcを畳み込んで、Proc#curryに引数を渡すことでこれが駆動するようにして実現しています。

#to_procも定義してあるので、&引数として渡すこともできます。

pc = ProcCompressor.new(2)

pc << ->n{ n * 2 } << ->n{ n + 5 }

[1, 2, 3, 4, 5].map(&pc) # => [7, 9, 11, 13, 15]


pc = ProcCompressor.new(3)

pc << :to_s.to_proc << ->s{ s + 'ist' } << :upcase.to_proc

[:ruby, :violin, :novel].map(&pc) # => ["RUBYIST", "VIOLINIST", "NOVELIST"]


pc = ProcCompressor.new(1)

between5to10 = ->n{ n.between? 5, 10 }

pc << between5to10

[*1..15].select(&pc) # => [5, 6, 7, 8, 9, 10]

ちょっとユニークでしょ?


参考記事:

Rubyで関数合成とかしたいので lambda_driver.gem というのを作った - ( ꒪⌓꒪) ゆるよろ日記

関連記事:

落ちていくRubyistのためのMethopオブジェクト


(追記:2014-4-27) 説明とコードを少し追加しました。


=== Ruby関連電子書籍100円〜で好評発売中! ===

M’ELBORNE BOOKS

pack8 rack ruby_parallel



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS