Newbie question about classes and class parameters
Frank Atanassow
franka@cs.uu.nl
Wed, 17 Oct 2001 14:49:53 +0200
Dmitry Astapov wrote (on 17-10-01 11:25 +0300):
> Let's say we have infamous Set class defined this way:
>
> > class Set s a where
> > empty :: s a
> > isEmpty :: s a -> Bool
[..]
> > instance Set IntegerSuperSet where
> > empty = ISS (SL [])
> > isEmpty (ISS (SL [])) = True
> > isEmpty _ = False
>
> gives me:
> Reading file "/tmp/bug.lhs":
> ERROR /tmp/bug.lhs:38 - Wrong number of arguments for class "Set"
>
> Obviously I am missing something very important here. Could someone enlighten me?
First, the class declaration defines Set as having two parameters, s and a. In
an instance declaration, you must supply types for both. So:
instance Set IntegerSuperSet Integer where
...
would be correct, except for the second problem, which is that in Set s a, s
is actually type constructor (of kind * -> *), while the argument which you
try to supply for s, namely IntegerSuperSet, is a type constant (of kind
*). So there is a kind mismatch. Try this instead:
data SuperSet a = SuperSet (SetAsList a)
instance Set SuperSet a where
...
--
Frank Atanassow, Information & Computing Sciences, Utrecht University
Padualaan 14, PO Box 80.089, 3508 TB Utrecht, Netherlands
Tel +31 (030) 253-3261 Fax +31 (030) 251-379