On 14 April 2010 03:48, Brent Yorgey <byor...@seas.upenn.edu> wrote: > Can someone more well-versed in the intricacies of type checking with > associated types explain this? Or is this a bug in GHC?
Hi Brent Maybe you can't compose linear maps of the same type, and thus can't build a valid monoid instance? If you take the definition of append out out the class - GHCi will give it a type: > append (Affine a2 b2) (Affine a1 b1) = Affine (a2 *.* a1) (lapply a2 b1 ^+^ > b2) *VectorSpace> :t append append :: (Scalar v ~ Scalar v1, Basis v ~ Basis u, Basis v1 ~ Basis v, VectorSpace v1, HasTrie (Basis v), HasBasis v, HasBasis u) => Affine v1 -> Affine v -> Affine v1 If you add that type back to the file containing append it no longer type checks... VectorSpaceTest.hs:44:54: Couldn't match expected type `Basis u' against inferred type `Basis u1' NB: `Basis' is a type function, and may not be injective Expected type: u :-* v Inferred type: v :-* v In the second argument of `(*.*)', namely `a1' In the first argument of `Affine', namely `(a2 *.* a1)' Failed, modules loaded: none. [ It also has the problem that its type isn't compatible with monoidal mappend anyway ] You can get empty to type check with this signature: empty :: (HasTrie u, u ~ Basis v, HasBasis v) => Affine v But trying to get append to type check with the same class constraints... append :: (HasTrie u, u ~ Basis v, HasBasis v) => Affine v -> Affine v -> Affine v ... gets another error where the inferred type of 'LinearMap' is from one type to the same type: VectorSpaceTest.hs:33:54: Couldn't match expected type `Basis u' against inferred type `u1' `u1' is a rigid type variable bound by the type signature for `append' at VectorSpace.hs:31:19 NB: `Basis' is a type function, and may not be injective Expected type: u :-* v Inferred type: v :-* v In the second argument of `(*.*)', namely `a1' In the first argument of `Affine', namely `(a2 *.* a1)' Failed, modules loaded: none. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe