
Hi, I am trying to understand some differences of parameterizing or not some arguments of type families. I have some code such as *type family G a :: * -> * instance Functor (G Int) where fmap f (Left ()) = Left () fmap f (Right x) = Right (f x) ggg :: Functor (G a) => G a x -> G a x ggg = fmap id* and it works fine. However, I need to parameterize one extra argument (due to type equality): *type family F a x :: * class FunctorF d where fmapF :: (x -> y) -> F d x -> F d y fff :: (FunctorF a) => F a b -> F a b fff = fmapF id* This second scenario fails to compile because the compiler cannot unify types a and b with types d and x from the fmapF declaration. Is there any other option than passing dummy variables to fmapF? * class FunctorF d where fmapF :: d -> x -> (x -> y) -> F d x -> F d y fff :: (FunctorF a) => a -> b -> F a b -> F a b fff a b = fmapF a b id* Thanks, hugo