[Haskell-cafe] Re: what is inverse of mzero and return?

Keean Schupke k.schupke at imperial.ac.uk
Tue Jan 25 08:20:36 EST 2005


Jules Bean wrote:

>
> Well, mzero isn't a return value in the IO monad, it's an exception.  
> But yes, I agree with you that the (plausible) laws I have seen for 
> MonadPlus seem to say that mzero should ignore the actions. But this 
> in practice is not how IO behaves.
>
> Jules
>
I can see three possible solutions:

    1) IO is not an instance of MonadPlus (but may still be an instance 
of MonadError)
    2) Side effects are ignored (or state is ignored) and IO may be an 
instance of MonadPlus

    3) bind (>>=) is redefined for IO. As the IO Monad is a function 
which resturns a computation,
    bindIO can be changed such that (a >> mzero === mzero). In other 
words if the RHS is mzero, the
    LHS is not included in the final result (and its actions would not 
get executed), however this
    must be inconsistent if we consider:

       f = getChar >>= (\a -> if a == "F" then mzero else return a)

    In this case if the LHS returns "F" the LHS should not have been 
run... this contradicts itself, so
    this is a non option I guess.

Acutally looking at GHC CVS libraries, there is not a definition for 
MonadPlus on the state or IO
monads...

    Keean.


More information about the Haskell-Cafe mailing list