<div dir="ltr"><div dir="ltr"><div>instance Monad ZipList where<br>    ZipList [] >>= _ = ZipList []<br>    ZipList (x:xs) >>= f = ZipList $ do<br>        let ZipList y' = f x<br>        guard (not (null y'))<br>        let ZipList ys = ZipList xs >>= ZipList . join . maybeToList . fmap snd . uncons . getZipList . f<br>        head y' : ys</div><div><br></div><div>instance MonadFail ZipList where<br>    fail _ = empty</div><div><br></div><div>instance MonadPlus ZipList</div></div></div>