[Haskell-cafe] a simpler way to declare typeclass instances

Alexey Muranov alexey.muranov at gmail.com
Sat Oct 25 15:42:43 UTC 2014


i am trying to understand how typeclasses work.  I know that they can be used as follows (from the manual):

    data Foo = Foo {x :: Integer, str :: String}

    instance Eq Foo where
       (Foo x1 str1) == (Foo x2 str2) = (x1 == x2) && (str1 == str2)

I am wondering, why is the following seemingly unambiguous syntax not allowed too?

    data Foo = Foo { x :: Integer, str :: String }

    instance Eq Foo

    (Foo x1 str1) == (Foo x2 str2) = (x1 == x2) && (str1 == str2)

If it was allowed, it seems that it could also be applied to records:

    class HasName r where
        name :: r -> String

    data Bird   = Bird { name :: String, wingNumber :: Integer }
    data Person = Person { name :: String, likesBirds :: Bool }

    instance HasName Bird
    instance HasName Person


More information about the Haskell-Cafe mailing list