
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 want: 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