On Mon, Dec 16, 2013 at 5:50 PM, Herbert Valerio Riedel <hvr@gnu.org> wrote:
On 2013-12-16 at 14:54:53 +0100, Andreas Abel wrote:
> On 16.12.2013 14:12, Roman Cheplyaka wrote:
>>>> The purpose of 'fail' is to handle monadic pattern-match failures.
>>>> I consider explicit use of 'fail' in user code a hack.
>>
>> I treat 'fail' as a semi-private method of the Monad class. I may
>> override it, but I should never call it. It only exists for the
>> compiler.
>
> This is useful information.  Please add it to the documentation.  That
> would definitely help newcomers to get some orientation in the design
> space of exceptions...

[...]

If this is really the intent of `fail`, shouldn't we then also attach a

  {-# WARNING fail "Monad(fail) is not supposed to be called directly" #-}

to the `fail` method definition to help catch illegal uses of `fail` in
user code?

(Fwiw, I've tested attaching such a warning to `fail` in GHC HEAD's
libraries/base/GHC/Base.lhs and it seems to work just fine so far... so
if there's consensus, we could add that for GHC 7.8)

Cheers,
  hvr
_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://www.haskell.org/mailman/listinfo/libraries

+1!

I think `fail` is a huge wart anyway.

I'm still partial to the Haskell 1.4 solution to this problem, where the translation of refutable patterns in do-notation would involve `mzero` rather than `fail "Here, have some debugging info."`.

:),
Stijn