<div dir="ltr">I still don't think you can do it just from the default method's type. A typical case is the following:<div><br></div><div><font face="monospace, monospace">class C a where</font></div><div><font face="monospace, monospace">  op :: a -> Int</font></div><div><font face="monospace, monospace">  default op :: (Generic a, GC (Rep a)) => a -> Int</font></div><div><br></div><div>When giving an instance C [a], you might well find out that you need C a =>, but this is not something</div><div>you can see in the type of the default method; it follows only after the expansion of Rep [a] and resolving</div><div>the GC constraint a number of times.</div><div><br></div><div><br></div><div>Best regards,</div><div>Pedro </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 17, 2016 at 12:43 PM, Simon Peyton Jones <span dir="ltr"><<a href="mailto:simonpj@microsoft.com" target="_blank">simonpj@microsoft.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">| My question is then: why does DeriveAnyClass take the bizarre approach<br>
| of co-opting the DeriveFunctor algorithm? Andres, you originally<br>
| proposed this in #7346 [2], but I don't quite understand why you<br>
| wanted to do it this way. Couldn't we infer the context simply from<br>
| the contexts of the default method type signatures?<br>
<br>
</span>That last suggestion makes perfect sense to me.  After all, we are going to generate an instance looking like<br>
<br>
instance .. => C (T a) where<br>
  op1 = <default-op1><br>
  op2 = <default-op2><br>
<br>
so all we need in ".." is enough context to satisfy the needs of <default-op1> etc.<br>
<br>
Well, you need to take account of the class op type sig too:<br>
<br>
class C a where<br>
  op :: Eq a => a -> a<br>
  default op :: (Eq a, Show a) => a -> a<br>
<br>
We effectively define<br>
  default_op :: (Eq a, Show a) => a -> a<br>
<br>
Now with DeriveAnyClass for lists, we effectively get<br>
<br>
instance ... => C [a] where<br>
   op = default_op<br>
<br>
What is ..?  Well, we need (Eq [a], Show [a]); but we are given Eq [a] (because that's op's instantiated type.  So Show a is all we need in the end.<br>
<br>
Simon<br>
_______________________________________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
</blockquote></div><br></div>