[Haskell-cafe] Re: partial functions / failure,
Maybe and MonadError and good style
Stefan O'Rear
stefanor at cox.net
Fri Dec 22 21:52:29 EST 2006
On Fri, Dec 22, 2006 at 09:44:35PM -0500, Steve Downey wrote:
> I suppose this is why Maybe is a monad rather than just another
> algebraic data type.
Maybe is an algebraic datatype. A monad is simply a structure defined on
the datatype, reflecting a normal pattern of use.
> This is exactly where I'm stuck. I've an eval1 function of ArithExpr
> -> m ArithExpr, where m started out as Maybe. Now only the calling
> eval function mentions Maybe. And I was wondering if I could keep
> eval1 generic.
That should be easy - anything you can do in Maybe or Either can be
done in an arbitrary MonadError.
f :: (MonadError e m, Error e) => Maybe a -> m a
f Nothing = throwError noMsg
f (Just x) = return x
g :: (MonadError e m, Error e) => Either String a -> m a
g (Left e) = throwError $ strMsg e
g (Right x) = return x
h :: (MonadError e m) => Either e a -> m a
h (Left e) = throwError e
h (Right x) = return x
> OTOH, eval1 should really pass through information from the underlying
> parser...
If you have a type of errors, pattern 'h' above should be applicable?
More information about the Haskell-Cafe
mailing list