zipWith generalises
zip by zipping with
the function given as the first argument, instead of a tupling
function.
zipWith (,) xs ys == zip xs ys
zipWith f [x1,x2,x3..] [y1,y2,y3..] == [f x1 y1, f x2 y2, f x3 y3..]
zipWith is right-lazy:
>>> let f = undefined
>>> zipWith f [] undefined
[]
zipWith is capable of list fusion, but it is restricted to its
first list argument and its resulting list.
Examples
zipWith (+) can be applied to two lists to
produce the list of corresponding sums:
>>> zipWith (+) [1, 2, 3] [4, 5, 6]
[5,7,9]
>>> zipWith (++) ["hello ", "foo"] ["world!", "bar"]
["hello world!","foobar"]