hp12c
26 April 2014

RubyにおけるYet Another関数合成

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



Please enable JavaScript to view the comments powered by Disqus. blog comments powered by Disqus
ruby_pack8

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


AltStyle によって変換されたページ (->オリジナル) /