
On 20/01/2012 03:23, Edward Z. Yang wrote:
Oh, I'm sorry! On a closer reading of your message, you're asking not only asking why 'fail' was added to Monad, but why unfailable patterns were removed.
Well, from the message linked:
In Haskell 1.4 g would not be in MonadZero because (a,b) is unfailable (it can't fail to match). But the Haskell 1.4 story is unattractive becuase a) we have to introduce the (new) concept of unfailable b) if you add an extra constructor to a single-constructor type then pattern matches on the original constructor suddenly become failable
(b) is a real killer: suppose that you want to add a new constructor and fix all of the places where you assumed there was only one constructor. The compiler needs to emit warnings in this case, and not silently transform these into failable patterns handled by MonadZero...
It's pretty ugly, but what about using a different 'do' to select the MonadZero behaviour? "failable-do Foo x <- bar" translates to mzero, whereas "do Foo x <- bar" translates to an error. That way programmer intent is captured locally. "failable-do" is a straw man name :-) Ganesh