# broken Monad Either instance?

Isaac Dupree ml at isaac.cedarswampstudios.org
Tue Nov 29 00:26:47 CET 2011

```On 11/28/2011 05:32 PM, Jake McArthur wrote:
> On Mon, Nov 28, 2011 at 2:47 PM, Bas van Dijk<v.dijk.bas at gmail.com>  wrote:
>> 4) Only give do-expressions with pattern bindings with uncomplete
>> patterns a MonadFail constraint.
>>
>> To me 2, 3 and 4 seem fishy. I like 1 a lot but I'm unsure how many
>> programs will break because of it.
>
> Number 4 is the one I had in mind. The basic rule would be that if the
> pattern is refutable (that is, not irrefutable as defined by section
> 3.17.2 in the Haskell 2010 report) then MonadFail is required.

That seems like a fishy rule for the purpose.

Refutable: (a, b)
Irrefutable: a
Refutable patterns are those which immediately fail if the value bound
is ⊥ (bottom). [1]

If the value is ⊥ for a refutable monadic pattern, MonadFail can't do
anything about this. An imprecise exception will be thrown.  No
exceptions.(pun horribly intended[2]).

And I don't think we can tweak the suggested rule to allow
single-constructor 'data' (which we know would never be able to call
"fail" via pattern) if we want it also to behave exactly as nicely as
we'd like for all GADTs.  Argh.

I suppose we could make a keyword 'fdo', generating type MonadFail, like
'mdo' generates MonadFix...
(or actually we switched to "do { rec }" rather than "mdo" [3]... so.)

-Isaac

[1]
H2010 says, as you cited, "It is sometimes helpful to distinguish two
kinds of patterns. Matching an irrefutable pattern is non-strict: the
pattern matches even if the value to be matched is ⊥. Matching a
refutable pattern is strict: if the value to be matched is ⊥ the match
diverges. The irrefutable patterns are as follows: a variable, a
wildcard, N apat where N is a constructor defined by newtype and apat is
irrefutable (see Section 4.2.3), var at apat where apat is irrefutable, or
of the form ~apat (whether or not apat is irrefutable). All other
patterns are refutable."

[2] ...and not quite accurate because nontermination is also a ⊥.  But I
couldn't resist.

[3]
http://haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#recursive-do-notation

```

More information about the Libraries mailing list