:: (a -> b -> c) -> [a] -> [b] -> [c] package:numeric-prelude
zipWith generalises
zip by zipping with
the function given as the first argument, instead of a tupling
function. For example,
zipWith (+) is applied to two
lists to produce the list of corresponding sums:
>>> zipWith (+) [1, 2, 3] [4, 5, 6]
[5,7,9]
zipWith is right-lazy:
zipWith f [] _|_ = []
zipWith is capable of list fusion, but it is restricted to its
first list argument and its resulting list.
Zip two lists which must be of the same length. This is checked only
lazily, that is unequal lengths are detected only if the list is
evaluated completely. But it is more strict than zipWithPad
undefined f since the latter one may succeed on unequal length
list if f is lazy.