Differences in pattern matching syntax?

Simon Peyton-Jones simonpj at microsoft.com
Fri Jan 16 11:07:09 EST 2009

OK once I bit the bullet and looked at the code the bug was obvious.

When you pattern match
        Ru{rrsrt = AlwaysExpr} -> error "blah"
GHC uses, well,  pattern-matching to see if rrsrt is AlwaysExpr.

But when you say

        Ru{} -> if (rrsrt r == AlwaysExpr)  then error "blah" else ...

then GHC uses the (==) operation for the data type RuleType (of which AlwaysExpr) is a data constructor.

Sadly you have not defined it. You just say

   instance Eq RuleType

That uses the default methods for equality. Its equivalent to
   instance Eq RuleType where
      (==) a b = not (a /= b)
        (/=) a b = not (a == b)

So it's not surprising that you get a loop.  You probably wanted to use "deriving Eq" on your data type declaration for RuleType, or
        deriving instance Eq RuleType

So, clearly not a bug in GHC; but it would be more felicitous if it gave you a warning about the instance declaration for Eq RuleType.  The difficulty is that it's not clear when to warn; it's ok to use default methods, but you must define *either* (==) *or* (/=).


More information about the Glasgow-haskell-users mailing list