Hi all, Consider the following declarations.
> -- from vector-space package: > (*.*) :: (HasBasis u, HasTrie (Basis u), > HasBasis v, HasTrie (Basis v), > VectorSpace w, > Scalar v ~ Scalar w) > => (v :-* w) -> (u :-* v) -> u :-* w > > -- my code: > data Affine v = Affine (v :-* v) v > > instance (HasBasis v, HasTrie (Basis v), VectorSpace v) => Monoid (Affine v) > where > mempty = Affine idL zeroV > mappend (Affine a2 b2) (Affine a1 b1) = Affine (a2 *.* a1) (lapply a2 b1 > ^+^ b2) When I try to compile this, I get the following error: No instance for (HasTrie (Basis u)) arising from a use of `*.*' at Diagrams.hs:107:50-58 Possible fix: add an instance declaration for (HasTrie (Basis u)) In the first argument of `Affine', namely `(a2 *.* a1)' In the expression: Affine (a2 *.* a1) (lapply a2 b1 ^+^ b2) In the definition of `mappend': mappend (Affine a2 b2) (Affine a1 b1) = Affine (a2 *.* a1) (lapply a2 b1 ^+^ b2) This seems bizarre to me; it seems like GHC ought to be able to infer that in my use of (*.*), u,v, and w are all instantiated to the v in the instance declaration, and hence all the required constraints are satisfied. I have no idea why it would be complaining about u --- there's nothing called u in my instance declaration. Can someone more well-versed in the intricacies of type checking with associated types explain this? Or is this a bug in GHC? -Brent _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe