On 9/13/06, Bertram Felgenhauer <[EMAIL PROTECTED]> wrote:
Michael Shulman wrote:
>
> class MonadList m where
> option :: [a] -> m a
[...]
There's no need for an extra class, it can be done with MonadPlus:
option :: MonadPlus m => [a] -> m a
option = msum . map return
But this doesn't always give the behavior I want. It works for any
monad of the form (ListT m), but not for a monad like (ErrorT e []).
I would want
runErrorT $ do
x <- option [1..3]
return x
to return [Right 1, Right 2, Right 3], but with your definition it
returns [Right 1]. This is because (ErrorT e []) inherits its
instance of MonadPlus from Error, not from []. (Is there a reason for
this, or is it just assumed that this is the more frequently desired
behavior?) However, I declare
instance (Error e) => MonadList (ErrorT e []) where
option = lift
then the above code does return [Right 1, Right 2, Right 3].
Mike
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe