
On Sun, May 25, 2008 at 07:58:44AM -0400, Dan Doel wrote:
I don't think we should get rid of fail. There's nothing wrong with it, per se. It just shouldn't be in Monad, it should be in MonadPlus (or MonadZero if things get split back up 1.4 style). fail is mzero that takes a string to explain what happened.
No, it's a different value: one can write programs that distinguish them. Haskell 98 treats error "string" as _|_ only because it can't analyse _|_.
[...] The problem is calling fail in monads that don't have an mzero, because they don't have a notion of failure.
That is indeed part of the problem, because someone will define an instance for those monads, for the sake of convenience.
I didn't mean to say that Maybe is arbitrary. I meant that specializing to Maybe makes it more inconvenient to use with other MonadPlus instances, and I don't see a benefit to counter that.
There is a choice here between convenience and safety. What would Haskell choose?
[...] That's not to mention potential information loss compared to fail.
which does not arise in this particular case.
[...] I just think it's frustrating that we have abstractions that do exactly what we want, and then don't use them. :)
It's not an abstraction: it's overloading. It conflates three different things (an element of a view, exceptions and runtime errors).