On Sun, Feb 13, 2005 at 04:57:46PM +0100, Remi Turk wrote:
> According to http://www.haskell.org/hawiki/MonadPlus (see also
> the recent thread about MonadPlus) a MonadPlus instance
> should obey m >> mzero === mzero, which IO doesn't. IOW, the
> MonadPlus instance for IO (defined in Control.Monad.Error)
> probably shouldn't be there.

True.  In the IO monad there are side effects that don't get "erased" when
a later action raises an exception as that law would suggest.  But any
IO-like monad that I'm likely to implement will have the same discrepancy,
and in any IO code that catches "enough" exceptions to be bug-free will be
immune to this issue.

Basically, the issue is that

   do { writeFile "foo" "bar"; writeFile "bar" "foo" } `catch`
   \_ -> putStr "Couldn't create file\m"

may reach the putStr with or without the file "foo" existing, and there's
no way to know whether or not it was created.  But that just means the code
was written sloppily--that is, if the existence of that foo file is
important.

In my uses of MonadPlus, I'd have other schemes essentially immitating IO,
so they'd duplicate this behavior (later errors don't undo earlier
actions), and well-written functions would depend on that.

It might be interesting to write a "backtracking" IO-like monad which
obeyed m >> mzero === mzero.  I imagine you could do it for something like
an ACID database, if you define === as meaning "has the same final result
on the database", which of course would only be useful if the database had
sufficient locking that it couldn't have been read between the original m
and the later mzero.
-- 
David Roundy
http://www.darcs.net
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to