import Control.Monad import Control.Applicative -- Shows that the Monad constraint on sequence can be weakened. -- See sequence' :: Applicative m => [m a] -> m [a] sequence' ms = foldr liftedCons (pure []) ms where liftedCons = liftA2 (:) --liftedCons m m' = (:) <$> m <*> m' test = sequence' listOfMs == sequence listOfMs where listOfMs :: [Maybe Int] listOfMs = [pure 3, pure 4, pure 5]