diff --git a/ghc/lib/std/Monad.lhs b/ghc/lib/std/Monad.lhs index 2be1dba4394fc8d849baf7ca7e31dc80083cda00..1421209e2eaedbdb15ca583a7c28ac9d60f1dd53 100644 --- a/ghc/lib/std/Monad.lhs +++ b/ghc/lib/std/Monad.lhs @@ -58,14 +58,17 @@ guard p = if p then return () else zero -- This subsumes the list-based filter function. +{-# SPECIALISE filter :: (a -> Bool) -> [a] -> [a] #-} filter :: MonadZero m => (a -> Bool) -> m a -> m a filter p = applyM (\x -> if p x then return x else zero) -- This subsumes the list-based concat function. +{-# SPECIALISE concat :: [[a]] -> [a] #-} concat :: MonadPlus m => [m a] -> m a concat = foldr (++) zero +{-# SPECIALISE applyM :: (a -> [b]) -> [a] -> [b] #-} applyM :: Monad m => (a -> m b) -> m a -> m b applyM f x = x >>= f \end{code}