<br>On Fri, Mar 18, 2011 at 13:35, JP Moresmau wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">These are GHC types, but here is a self-contained example:<br>


{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,<br>
FlexibleInstances #-}<br>
<br>
data Id=Id String<br>
<br>
data Result id =ResultId Id<br>
    | ResultGen id<br>
<br>
data Sig id=IdSig Id<br>
    | SigGen id<br>
<div class="im"><br>
class Search id a | a -&gt; id where<br>
</div>  search :: a -&gt; Result id<br>
<div class="im"><br>
instance Search Id Id where<br>
</div>  search i = ResultId i<br>
<div class="im"><br>
instance (Search id id) =&gt; Search id (Sig id) where<br>
</div>  search (SigGen g)   = search g<br>
  search (IdSig i)    = search i<br>
<br>
The last line fails. I don&#39;t understand why this doesn&#39;t compile.<br></blockquote><div><br>This doesn&#39;t even work in GHC 6.12.3. The search call in the second case, IdSig, restricts the result to Result Id, which is less polymorphic than Result id. Either of the following are valid:<br>

<br>instance Search Id (Sig Id) where<br>  search (SigGen g)   = search g<br>  search (IdSig i)    = search i<br><br>instance (Search id id) =&gt; Search id (Sig id) where<br>  search (SigGen g)   = search g<br><br>Sean<br>

</div></div>