
David McBride wrote (2013-04-12 09:39:59 -0400):
I don't know if this is the most advisable way to go about things, but if you add the FunctionalDependencies extension you can do this:
class Collection i c => Annotation i c a | a -> c where
Thanks for the advice. I already tried functional dependencies, but not like that. As far as I understand how they work, this notation means c is uniquely determined by a, but I would prefer beign able to handle generic annotation types, which apply to several collections. I also came up with a working solution using existential quantification, but my understanding of it is quite limited so I don't know if it is a good idea: data AnyCollection i = forall c. (Collection i c) => Coll c class Annotation i a where collection :: a y -> AnyCollection i -- access the underlying Collection select :: a y -> i -> y -- select the annotation of an item given its index instance Annotation Int (MyAnnotation Things) where collection (Ann c _) = Coll c select (Ann _ as) i = as !! i -- Olivier