Techioz Blog

Ruby で Haskell の scanl に相当するものは何ですか?

概要

この質問は、Python での Haskell の scanl のバージョンを示していますが、この関数の Ruby バージョンはありますか?

解決策

Reduce() を使用して自分で実装することもできます。

def scanl(op, init, range)
  op = op.to_proc unless op.is_a?(Proc)
  range.reduce([init]) { |a, e| a.push(op.call(a.last,e)) }
end

p scanl(lambda { |a, b| a + b }, 0, 1..10)
#=> [0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
p scanl(:+, 0, 1..10)
#=> [0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]

あるいは、map() を使用して、配列の前に最初の要素を置くこともできます。

def scanl(op, init, range)                             
  op = op.to_proc unless op.is_a?(Proc)                
  acc = init                                           
  range.map { |e| acc = op.call(acc, e) }.unshift(init)
end