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