Solution (source code)

= Solution

Apply the supplied <function> to corresponding elements while preserving the stopping rule:

``
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f []     _      = []
zipWith f _      []     = []
zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
``

Because of <lazy evaluation>, constructing a result cons does not by itself evaluate `f x y`.