>>> 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.
do a <- as b <- bs pure (f a b)
liftM2 (+) [0,1] [0,2] = [0,2,1,3] liftM2 (+) (Just 1) Nothing = Nothing