To summarize: Monad isn't the proper abstraction for failable/Maybe. Maybe is an algebraic data type that *exactly* represents the spirit of what you're trying to do: e.g. Conor McBride said: "Maybe is the most general abstraction. Requiring (>>=), or even (<*>) seems excessive. What we need is "any f with zero and return", so why not pick the canonical, initial, inductively defined such thing?" In this case the typeclass adds no generality to the function's behaviour (Maybe can be trivially converted to any other type, with a combinator even). And the confusion that results, when the function is almost always used at type Maybe anyway. If you want to read the whole discussion... if you haven't been subscribed to [EMAIL PROTECTED] , it's archived:
http://thread.gmane.org/gmane.comp.lang.haskell.libraries/9082

Thanks for the summary. I had been wondering about this
change of mood, and I disagree with the suggestion that
Maybe Nothing is the right replacement for Monad fail. Whether fail should be in Monad, or whether we really want MonadZero, MonadPlus, MonadError, or something else entirely has been open for discussion, but it is easily shown that Maybe is not the most general abstraction - it loses information wrt to (Either String), for instance:

Prelude> let {f [] = fail "empty"; f [_] = fail "singleton"; f l = return l }
Prelude> f [] :: Maybe [Bool]
Nothing
Prelude> f [True] :: Maybe [Bool]
Nothing
Prelude> f [True,False] :: Maybe [Bool]
Just [True,False]
Prelude>
Prelude> :m +Control.Monad.Error
Prelude Control.Monad.Error> f [] :: Either String [Bool]
Left "empty"
Prelude Control.Monad.Error> f [True] :: Either String [Bool]
Left "singleton"
Prelude Control.Monad.Error> f [True,False] :: Either String [Bool]
Right [True,False]

You can specialise Monad to Maybe, but you can't get
back to the general handling of failure without losing the
failure messages!

Choosing Maybe over (Either String) means: "I don't care
about the failure messages" (not that String is necessarily the
best way to represent failure conditions, but that is another
story again). As anyone who has ever tried to use a Parser
based on that choice can attest, that choice should not be
taken lightly ("Compilation failed. There were errors.").

Claus


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to