Maybeモナド
http://moonbase.rydia.net/mental/writings/programming/monads-in-ruby/00introduction.htmlからほぼそのままコピペ.
テストコードはふつケルから.
class Maybe def Maybe::unit( val ); new( true, val ); end def Maybe::nothing(); new( false, nil ); end def initialize( flag, val ) @flag, @val = flag, val end def bind (@flag)? yield(@val): Maybe::nothing() end attr_reader :flag attr_reader :val def to_s (@flag)? 'Just ' + @val.to_s: 'Nothing' end end def lookup( key, data) data.each {|x,y| return Maybe::unit(y) if (x==key) } Maybe::nothing() end en_num = [['one', 1], ['two',2], ['three',3]] p lookup( 'three', en_num).to_s #=> "Just 3" p lookup( 'four', en_num).to_s #=> "Nothing" config = [ ['database', [['path', 'var_app_db'], ['encoding', 'euc-jp']]], ['urlmapper', [['cgiurl', 'app'], ['rewrite','true']]], ['template', [['path', 'var_app_template']]] ] p lookup( 'database', config).bind {|x| lookup( 'encoding', x)}.to_s #=> "Just euc-jp"
うれしさがよく判らない.
例外処理を通常の処理から分離できるのはすっきりしていいかも?