[Haskell-cafe] Re: Numeric type classes

Brian Hulley brianh at metamilk.com
Wed Sep 13 14:20:23 EDT 2006


Henning Thielemann wrote:
> On Wed, 13 Sep 2006, Lennart Augustsson wrote:
>> I don't think Haskell really has the mechanisms for setting up an
>> algebraic class hierarchy the right way.  Consider some classes we
>> might want to build: SemiGroup
>> Monoid
>> AbelianMonoid
>> Group
>> AbelianGroup
>> SemiRing
>> Ring
>> ...
>>
>> The problem is that going from, say, AbelianMonoid to SemiRing you
>> want to add a new Monoid (the multiplicative) to the class.  So
>> SemiRing is a subclass of Monoid in two different way, both for +
>> and for *.
>> I don't know of any nice way to express this is Haskell.
>
> Thanks for confirming what I wrote. :-)

If the above is equivalent to saying "Monoid is a *superclass* of SemiRing 
in two different ways", then can someone explain why this approach would not 
work (posted earlier):

    data Multiply = Multiply
    data Add = Add

    class Group c e where
        group :: c -> e -> e -> e
        identity :: c -> e
        inverse :: c -> e -> e

    instance Group Multiply Rational where
        group Multiply x y = ...
        identity Multiply = 1
        inverse Multiply x = ...

    instance Group Add Rational where
        group Add x y = ...
        identity Add = 0
        inverse Add x = ...

    (+) :: Group Add a => a -> a -> a
    (+) = group Add

    (*) = group Multiply

    class (Group Multiply a, Group Add a) => Field a where ...

If the objection is just that you can't make something a subclass in two 
different ways, the above is surely a counterexample. Of course I made the 
above example more fixed than it should be ie:

    class (Group mult a, Group add a) => Field mult add a where ...

and only considered the relationship between groups and fields - obviously 
other classes would be needed before and in-between, but perhaps the problem 
is that even with extra parameters (to represent *all* the parameters in the 
corresponding tuples used in maths), there is no way to get a hierarchy?

Thanks, Brian.
-- 
Logic empowers us and Love gives us purpose.
Yet still phantoms restless for eras long past,
congealed in the present in unthought forms,
strive mightily unseen to destroy us.

http://www.metamilk.com 



More information about the Haskell-Cafe mailing list