In playing with compositions involving functors & cofunctors, I've run into a conflict in the instances I want to provide.  I imagine this sort of problem is well-known, and I'd like to hear what kinds of strategies people apply.
<br><br>Here&#39;s a definition of type composition:<br><br><span style="font-family: courier new,monospace;">&nbsp; newtype O g f a = O { unO :: g (f a) }</span><br><br>and a cofunctor class:<br><br><span style="font-family: courier new,monospace;">
&nbsp; class Cofunctor cof where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; cofmap :: (a -&gt; b) -&gt; (cof b -&gt; cof a)</span><br><br>We can compose functors to get a functor, cofunctors to get a functor, and functor &amp; cofunctor in either order to get a cofunctor.
<br><br><span style="font-family: courier new,monospace;">&nbsp; instance (Functor g, Functor f) =&gt; Functor (O g f) where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp; fmap h (O gf) = O (fmap (fmap h) gf)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp; instance (Cofunctor g, Functor f) =&gt; Cofunctor (O g f) where
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; cofmap h (O gf) = O (cofmap (fmap h) gf)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp; instance (Functor g, Cofunctor f) =&gt; Cofunctor (O g f) where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; cofmap h (O gf) = O (fmap (cofmap h) gf)
</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp; instance (Cofunctor g, Cofunctor f) =&gt; Functor (O g f) where</span>
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; fmap h (O gf) = O (cofmap (cofmap h) gf)</span><br><br>I&#39;ve wanted all four of those instances.&nbsp; The problem is that instance selection (in GHC at least) ignores the contexts.&nbsp; Without context, the first and fourth instances conflict, as do the second and third.&nbsp; Thus I statically choose two of the four rules and comment out the other two.&nbsp; Depending on my application, sometimes I like my choices, and sometimes I don&#39;t.
<br><br>Are there work-arounds to get the flexibility I want out of GHC?<br><br>Is it plausible to improve instance selection to use contexts?&nbsp; I imagine doing so would require some kind of backtracking search.<br><br>Thanks,&nbsp; - Conal
<br><br><br><br>