[Haskell-cafe] type classes
Cotton Seed
cotton at alum.mit.edu
Wed Jul 2 22:13:32 EDT 2008
Hi Dan,
Thanks! This is exactly what I was looking for.
Cotton
On Wed, Jul 2, 2008 at 9:57 PM, Dan Doel <dan.doel at gmail.com> wrote:
>
> On Wednesday 02 July 2008, Cotton Seed wrote:
> > Hi everyone,
> >
> > I'm working on a computational algebra program and I've run into a problem.
> > In my program, I have types for instances of algebraic objects, e.g. ZModN
> > for modular integers, and types for the objects themselves, e.g. ZModNTy
> > for the ring of modular integers.
> >
> > Now, I want to subclass ZModNTy from something like
> >
> > class RingTy a b where
> > order :: a -> Integer
> > units :: a -> [b]
> >
> > where `a' represents algebraic object, and `b' the type of instances of
> > that object. I want an instance
> >
> > instance RingTy ZModNTy ZModN where ...
> >
> > but then code that only uses order fails with errors like
> >
> > No instance for (RingTy ZModNTy b)
> > arising from a use of `order' at Test2.hs:16:8-15
> >
> > since there is no constraint on the second type variable.
> >
> > I think what I really want is
> >
> > class RingTy a where
> > order :: a b -> Integer
> > units :: a b -> [b]
> >
> > but this doesn't work either since ZModNTy is not parametric in its type
> > like, say, `Polynomial a' is.
> >
> > Is this a common problem? Is there a standard way to handle it?
>
> Correct me if I'm wrong, but wouldn't the a uniquely determine the b? In that
> case, you'd probably want a functional dependency:
>
> class RingTy a b | a -> b where
> order :: a -> Integer
> units :: a -> [b]
>
> This solves the problem with order, because with multi-parameter type classes,
> all the variables should be determined for a use of a method. Since b is not
> involved with order, it could be anything, so it's rather ambiguous. The
> functional dependency solves this by uniquely determined b from a, so order
> is no longer ambiguous.
>
> Alternately, with the new type families, this can become:
>
> class RingTy a where
> type RingElem a :: *
> order :: a -> Integer
> units :: a -> [RingElem a]
>
> Or something along those lines.
>
> Hope that helps.
> -- Dan
More information about the Haskell-Cafe
mailing list