+zipWith3M :: Monad m => (a -> b -> c -> m d) -> [a] -> [b] -> [c] -> m [d]
+zipWith3M _ [] _ _ = return []
+zipWith3M _ _ [] _ = return []
+zipWith3M _ _ _ [] = return []
+zipWith3M f (x:xs) (y:ys) (z:zs)
+ = do { r <- f x y z
+ ; rs <- zipWith3M f xs ys zs
+ ; return $ r:rs
+ }
+