<div dir="ltr">Isn't the solution always <div>  if generic programming makes things complicated, avoid it!<br><br></div><div>Here generic programming is where you define instances parametric on the phase index.</div><div>Why not defining three instances of the type class, one per each phase?</div><div>Yes, we get code duplication (which in this case is still not much as we use automatic deriving), but the compilation gets faster (which is the motivation), like [2].</div><div><br></div><div>[2] <a href="http://lpaste.net/360019">http://lpaste.net/360019</a></div><div><br></div><div>/Shayan </div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 13, 2017 at 2:05 PM, Alan & Kim Zimmerman <span dir="ltr"><<a href="mailto:alan.zimm@gmail.com" target="_blank">alan.zimm@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div>Just to clarify, this example is a simplification, in practice we would be applying different type for each type instance<br><br></div>e.g.<span class=""><br><br>type instance XEOverLit (GhcPass 'Parsed     ) = PlaceHolder<br>type instance XEOverLit (GhcPass 'Renamed    ) = PlaceHolder<br></span>type instance XEOverLit (GhcPass 'Typechecked) = Type<br><br></div>(modelling existing PostTc)<span class="HOEnZb"><font color="#888888"><br><br></font></span></div><span class="HOEnZb"><font color="#888888">Alan<br></font></span></div><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On 13 November 2017 at 11:23, Alan & Kim Zimmerman <span dir="ltr"><<a href="mailto:alan.zimm@gmail.com" target="_blank">alan.zimm@gmail.com</a>></span> wrote:<br></span><div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div>At the moment the Trees that Grow implementation in GHC master makes use of massive constraint types to provide Data instances for the hsSyn AST.<br><br></div>I am trying to remove the need for this, and have hit a problem.<br><br></div>The example I have reduced it to is here [1]<br><br></div>The essence of the problem is <br><br>-------------------<br>data Experiment p<br>  = Experiment {<br>      e_ext :: (XEOverLit p),<br>      e_val :: Int }<br>  | XExperiment (XXOverLit p)<br>deriving instance (Data (GhcPass p)) => Data (Experiment (GhcPass p))<br><br>type family XEOverLit  x<br>type family XXOverLit x<br><br>-- The following line works<br>-- type instance XEOverLit (GhcPass _) = PlaceHolder<br><br>-- The following 3 lines do noe<br>type instance XEOverLit (GhcPass 'Parsed     ) = PlaceHolder<br>type instance XEOverLit (GhcPass 'Renamed    ) = PlaceHolder<br>type instance XEOverLit (GhcPass 'Typechecked) = PlaceHolder<br><br>type instance XXOverLit (GhcPass _) = PlaceHolder<br>-------------------<br><div><br></div><div>Where specifying the type instance with a wild card keeps GHC happy (the XXOverLit case), but specifying for each of the three constructors for pass does not (the XEOverLit case)</div><div><br></div><div>The exact error message is</div><div><br></div><div>------------------------------</div><div>Experiment.hs:34:1: error:<br>    • Could not deduce (Data (XEOverLit (GhcPass p)))<br>        arising from a use of ‘k’<br>      from the context: Data (GhcPass p)<br>        bound by the instance declaration at Experiment.hs:34:1-69<br>    • In the first argument of ‘k’, namely ‘(z Experiment `k` a1)’<br>      In the expression: ((z Experiment `k` a1) `k` a2)<br>      In an equation for ‘gfoldl’:<br>          gfoldl k z Experiment a1 a2 = ((z Experiment `k` a1) `k` a2)<br>      When typechecking the code for ‘gfoldl’<br>        in a derived instance for ‘Data (Experiment (GhcPass p))’:<br>        To see the code I am typechecking, use -ddump-deriv<br>   |<br>34 | deriving instance (Data (GhcPass p)) => Data (Experiment (GhcPass p))<br>   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<wbr>^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<wbr>^^^^^^^^^<br>------------------------------<br></div><div><br>Alan</div><div><br></div><div>[1] <a href="http://lpaste.net/360017" target="_blank">http://lpaste.net/360017</a></div><div><br></div><div><br></div></div>
</blockquote></div></div></div><br></div>
<br>______________________________<wbr>_________________<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-<wbr>bin/mailman/listinfo/ghc-devs</a><br>
<br></blockquote></div><br></div>