On Wed, Dec 15, 2010 at 06:25:30PM +0100, Maciej Piechotka wrote: > On Wed, 2010-12-15 at 13:51 +0200, John Smith wrote: > > On 15/12/2010 11:39, Lennart Augustsson wrote: > > > Any refutable pattern match in do would force MonadFail (or MonadPlus if > > > you prefer). So > > > 1. (MonadFail m) => a -> m a, \ a -> return a > > > 2. (MonadFail m) => m a, mfail "..." > > > 3. (MonadFail m) => Maybe a -> m a, \ a -> case a of Nothing -> mfail > > > "..."; Just x -> return x > > > 4. (Monad m) => a -> b -> m a, \ a b -> return a > > > 5. (Monad m) => (a, b) -> m a, \ (a, b) -> return a > > > > > > As far as type inference and desugaring goes, it seems very little would > > > have to be changed in an implementation. > > > > Is there a need for a MonadFail, as distinct from mzero? fail always seems > > to be defined as error in ordinary monads, > > and as mzero in MonadPlus (or left at the default error). > > Not all types can implement mplus to begin with even if they can have > 'zero' type. For example technically Maybe breaks the laws while still > having useful fail: > > (guard . even) =<< (Just 1 <|> Just 2) > (guard . even) =<< Just 1 > guard (even 1) > guard False > Nothing > /= > Just () > Nothing <|> Just () > guard False <|> guard True > (guard (even 1)) <|> (guard (even 2)) > ((guard . even) =<< Just 1) <|> ((guard . even) =<< Just 2)
But that depends on what laws you choose for MonadPlus. See http://www.haskell.org/haskellwiki/MonadPlus . -Brent _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
