[Haskell-cafe] Re: Numeric type classes
carette at McMaster.ca
Wed Sep 13 14:38:52 EDT 2006
Your solution would imply that all Rational are multiplicatively
invertible -- which they are not.
The Rationals are not a multiplicative group -- although the _positive_
Rationals are. You can't express this in Haskell's type system AFAIK.
Your basic point is correct: if you are willing to use a tag (like
Multiply and Add), then you can indeed have a domain be seen as matching
an interface in 2 different ways. Obviously, this can be extended to n
different ways with appropriate interfaces.
 imply in the sense of intensional semantics, since we all know that
Haskell's type system is not powerful enough to enforce axioms.
PS: if you stick to 2 Monoidal structures, you'll be on safer grounds.
Brian Hulley 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.
More information about the Haskell-Cafe