[Haskell-cafe] Class/Instance : what am I doing wrong in this example ?

Jules Bean jules at jellybean.co.uk
Thu Dec 20 11:36:25 EST 2007

Tillmann Rendel wrote:
> david48 wrote:
>> class Gadget g where
>>   fInit  :: g -> a -> g

Tillman's two suggestions (below) are probably your answer.

Just to say what everyone else has said in a bunch of different ways: 
your class says that for ANY Gadget, fInit will work with ANY OTHER type a.

This doesn't seem to be what you want. There are three things you might 

1. Maybe you want a to always be String. Easy. fInit :: g -> String -> g

2. Maybe you want lots of possible different "a"s for each "g". Then you 
make "a" a parameter of the class too.

3. Maybe you want just one particular "a" for each "g". I.e. "g" 
determines "a". Then you can proceed as for (2), but add the functional 
dependency | g -> a

> These types are incompatible, your fInit implementation should be able 
> to work with whatever type a the caller has choosen to provide. Maybe 
> you should try one of
>   class Gadget g where
>     fInit  :: g -> String -> g
> or
>   class Gadget g a where
>     fInit  :: g -> a -> g

More information about the Haskell-Cafe mailing list