Ruby の Array#zip
はブロックを取れますが,戻り値は nil
となっているため,Haskell の zipWith
のような処理はできません.探してみましたがそれっぽいのは無いので自作してモンキーパッチを当てることにしました.
zip_with
class Array
def zip_with *args
if block_given?
self.zip(*args).map{|a| yield *a}
else
self.zip(*args).map
end
end
end
これで,下記のように zip_with
を使えます.
a = 1, 2, 3
b = 1.0, 2.0, 3.0
c = 'a', 'b', 'c'
a.zip_with(b, c){|i,j,k| (i*j).to_s + k } # => ["1.0a", "4.0b", "9.0c"]
ブロックを与えなかった場合の挙動がこれで良いのかよく分かっていないですが,とりあえずこんな感じに.