
On Wed, Mar 16, 2011 at 08:49:27AM +0000, Christian wrote:
Hello Haskell-Experts! I was trying to express the notion of a (mathematical) group in Haskell, using type classes, as an exercise. If I am not mistaken, a group can be for example the Reals together with the multiplication operation and "1" as the neutral element. Or, the Reals with addition and "0". my first idea was to write something like
class Group a where ...
_but_, I thought, I need to parameterise, so to speak, not only using the type "a", but also the group operation. How could I do that in Haskell? Is that even possible?
Yes, this is a problem, and it's not really possible directly. In this sort of situation what you often do is make two *newtypes* which are just wrappers around the type in question, and then make a different Group instance for each. As an example, you can look at Data.Monoid, which defines two newtype wrappers called Sum and Product, with additive and multiplicative Monoid instances respectively. (As an aside, the real numbers do *not* actually form a group under multiplication, since 0 has no inverse. However, the reals without 0 do.) -Brent