Listモナド(2)

2つの関数を繋げるだけなら,concatMapを作れば済むよな.もしかしたら同等のメソッドが標準であったりして….

class Array
  def concat_map( &block ); map(&block).inject([]){|c,a| c+a }; end
end

def expandPattern( str)
  expandCharClass(str).concat_map {|x| expandAltWords(x) }
end

p expandPattern("img[012].{png,jpg}")
#=> ["img0.png", "img0.jpg", "img1.png", "img1.jpg", "img2.png", "img2.jpg"]

expand〜はid:iken0:20071226#p3で定義.


言語の支援が無い状態での実用性はともかく,考え方としては面白い.

MaybeモナドやErrorモナドを見てると,安易にraiseとrescueを使いたくなってくる.