foldl,foldr

RubyHaskellの関数を書く・その2.今回はfoldlとfoldrに挑戦.とりもなおさずdupを乱用.だって,Haskellの関数定義が美しいんだもの.

def foldl(n,xs,&b)
  xss = xs.dup
  return n if xss.empty?
  foldl(b.call(n,xs.shift),xs,&b)
end

def foldr(n,xs,&b)
  xss = xs.dup
  return n if xss.empty?
  b.call(xss.shift,foldr(n,xss,&b))
end

irbで実行っ.

> foldl(64,[4,2,4]){|x,y| x/y}
=> 2
> foldr(2,[8,12,24,4]){|x,y| x/y}
=> 8

よしよし,動いてる.それでは,Rubyならではな文字列処理を.

> foldl("a",["b","c","d"]){|x,y| x.concat y}
=> "abcd"
> foldr("a",["b","c","d"]){|x,y| x.concat y}
=> "bcda"

うん,なんだか変な気分.


よく考えたら,いや,よく考えなくてもなんだけど,HaskellアルゴリズムのまんまRubyのコードに落としてたって意味ないじゃん(笑)今度からはRubyならではな感じで書かないとな.