
Dear all, Looking to learn a little haskell I tried to program up a little group theory but feel I am stuck on what the types should be. At first it seemed obvious (and the algebra package does this) that the type of a group should be given by: class Group g where mul :: g -> g -> g inv :: g -> g unit :: g My problem is this seems to assume that the type of group you are in is encoded by the type system. I first ran into problems with this when I wanted to define a cyclic group. The only way I could define the type was either to define each cyclic group separately so have C2, C3, C4, ... or parametrise it over the class Nat. So a cyclic group would have the type Cyclic (Succ(Succ( ... Succ(Zero)) ... )) which would consistently define all cyclic groups but is hardly any better. For example a computation mod a large prime p is not going to be pleasant. I came up with a partial solution by realising that a group is defined as a set X and some operations on it to get class Group g x where mul :: g -> x -> x -> x inv :: g-> x -> x unit :: g -> x Making it easy to define cyclic groups and all my old groups carry over. But now to evaluate an expression I need to hang onto the group i am in and pass it around. As i am newish to haskell I wanted to know if I have missed a simpler more obvious way of doing things? All the best, Robert Goss