For instance, we have:
flags :: [IO Bool]
What is the most concise way to fold flags with (&&)?
ie. To obtain the result if all flags (the elements of a list of True or False wrapped in IO) are True -> True, otherwise False
Please advise.
CodePudding user response:
Using Hoogle to search for Monad m => (a -> a -> a) -> [m a] -> m a didn't produce any results, but when I searched for Monad m => [m Bool] -> m Bool I found Control.Monad.Extra.andM:
-- | A version of 'and' lifted to a monad. Retains the short-circuiting behaviour.
andM :: Monad m => [m Bool] -> m Bool
which is exactly what's asked for.
CodePudding user response:
One possible solution is to import Control.Monad and
foldr (liftM2 (&&)) (Just True) flags
