
On Sat, Dec 23, 2006 at 02:33:51AM +0100, Lennart Augustsson wrote:
I would not advocate using the fail operation in a monad. It doesn't belong there, and hopefully it will go away some day. :)
On Fri, Dec 22, 2006 at 08:37:05PM -0500, Steve Downey wrote:
OK, but is msg always a string? Admidtedly, in the concrete case I have at hand (follow up posting RSN), that would be fine. I think I've also been looking at the map lookup case, where not only is lookup failure to be expected, it's almost an imposition to say something other than Nothing.
There is a more general form of monads that support failure, Control.Monad.Error.MonadError in the extended standard libraries; throwError noMsg :: (Error e, MonadError e m) => m a throwError . strMsg :: (Error e, MonadError e m) => String -> m a Error is any type that strings can be mapped into (I'm not talking about an injection, I just can't find a better word), such as String and IOError. Unfortunately there does not seem to be a standard instance for Maybe... -- This isn't in the standard library, and thus I conjecture that it -- is seriously flawed in a way I haven't noticed. instance Error () where noMsg = () ; strMsg _ = () instance MonadError () Maybe where throwError _ = Nothing Just x `catchError` f = Just x Nothing `catchError` f = f ()