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