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"


うれしさがよく判らない.

例外処理を通常の処理から分離できるのはすっきりしていいかも?