<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>   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<br>------------------------------<br></div><div><br>Alan</div><div><br></div><div>[1] <a href="http://lpaste.net/360017">http://lpaste.net/360017</a></div><div><br></div><div><br></div></div>