[Haskell-cafe] Re: partial functions / failure, Maybe and MonadError and good style

Steve Downey sdowney at gmail.com
Fri Dec 22 21:46:27 EST 2006


Actually, that is the version of Error I was looking at.

On 12/22/06, Stefan O'Rear <stefanor at cox.net> wrote:
> 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 ()
>


More information about the Haskell-Cafe mailing list