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