[Haskell-cafe] Query regarding Type classes

Ryan Ingram ryani.spam at gmail.com
Mon Oct 13 06:03:56 EDT 2008

Step 1: Forget everything you know about OO classes, then try again :)

2008/10/13 Arun Suresh <arun.suresh at gmail.com>:
> class Foo a where
>     fooFunc :: a -> Int
> data FooData = FData
> instance Foo FooData where
>     fooFunc _ = 10

So far so good.

> class Bar a where
>     barFunc :: (Foo b) => a -> b -> Int

So now, barFunc advertises "for any type a which is in the Bar
typeclass, and any type b which is in the Foo typeclass, I can give
you a function from a to b to Int".  You can make an implementation of
this that has different functionality based on "a", but it needs to be
polymorphic in "b", taking any type "b" which is a member of Foo.

> data BarData = BData
> instance Bar BarData where
>     barFunc _ FData = 20

Uh oh!  FData is of type FooData!  But we just advertised that we
could take *anything* which is in the typeclass Foo, which can include
any number of other types.  It doesn't matter that FooData is the only
declared member at this point.  What that means is that if you want to
do anything with the second argument, you can only use functions that
accept any type which is a member of the Foo class.  Right now that
just means generically polymorphic functions (id, const, etc.), and
the fooFunc function inside the "Foo" typeclass.

For example, this declaration would work:

instance Bar BarData where
    barFunc _ f = 10 + fooFunc f

> When I compile I get this :
>  Couldn't match expected type `b' against inferred type `FooData'
>       `b' is a rigid type variable bound by
>           the type signature for `barFunc' at Sample.hs:16:20
>     In the pattern: FData
>     In the definition of `barFunc': barFunc _ FData = 20
>     In the definition for method `barFunc'

The compiler is just telling you what I just told you: barFunc says
that it should take any type "b", but the pattern FData constrains the
argument to be a FooData.

> Think Im missing something really big...
> Could somebody kindly help me out here...

I recommend reading http://www.haskell.org/haskellwiki/OOP_vs_type_classes

  -- ryan

More information about the Haskell-Cafe mailing list