Search code examples
haskellinstance

Define EQ Instance


I am trying to create an Eq Instance, but I have some issues creating it.

I have the following data definitions:

data Link = G | S | P deriving (Eq, Show)
data Chain = Empty | Join Link Chain

And Now I want to convert Chain into an Eq Instance (True when it is the same).

Here is my current instance:

instance Eq Chain where
(Join a b) == (Join c d) = (a == c) && (b == d)
Empty      == Empty      = True
_          == _          = False

it marks (a == c) && (b == d)as mistake (Ambiguous occurrence ‘==’)

I am unsure why this is, and would appreciate it if someone could help me.

Thank you in advance!


Solution

  • You failed to indent the method definitions.

    instance Eq Chain where
    ↓↓
      Join a b == Join c d = a==c && b==d
      Empty    == Empty    = True
      _        == _        = False
    ↑↑
    

    ...Or alternatively, but highly dis-recommended, put them in braces

    instance Eq Chain where {
    Join a b == Join c d = a==c && b==d;
    Empty    == Empty    = True;
    _        == _        = False
    }
    

    Without the indentation or braces, what your code does is declare an empty Eq instance, and a separate, completely new operator that happens to be also called ==. I.e., you actually wrote this:

    module Ch where
    
    instance Eq Chain where
      -- missing definitions of `Prelude.==` here
    
    (Ch.==) :: Chain -> Chain -> Bool
    Join a b Ch.== Join c d = a==c && b==d
    Empty    Ch.== Empty    = True
    _        Ch.== _        = False
    

    The compiler error tells you that the a==c and b==d definitions are now ambiguous: is this referring to Prelude.== or to Ch.==?