And it seems that -------------------------------------- data Experiment p = Experiment { e_ext :: (XEOverLit p), e_val :: Int } | XExperiment (XXOverLit p) deriving instance (Data GhcPs) => Data (Experiment GhcPs) deriving instance (Data GhcRn) => Data (Experiment GhcRn) deriving instance (Data GhcTc) => Data (Experiment GhcTc) ----------------------------------------
works, but only for GHC 8.2.1, not GHC 8.0.2 Alan On 13 November 2017 at 11:23, Alan & Kim Zimmerman <alan.z...@gmail.com> wrote: > 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. > > I am trying to remove the need for this, and have hit a problem. > > The example I have reduced it to is here [1] > > The essence of the problem is > > ------------------- > data Experiment p > = Experiment { > e_ext :: (XEOverLit p), > e_val :: Int } > | XExperiment (XXOverLit p) > deriving instance (Data (GhcPass p)) => Data (Experiment (GhcPass p)) > > type family XEOverLit x > type family XXOverLit x > > -- The following line works > -- type instance XEOverLit (GhcPass _) = PlaceHolder > > -- The following 3 lines do noe > type instance XEOverLit (GhcPass 'Parsed ) = PlaceHolder > type instance XEOverLit (GhcPass 'Renamed ) = PlaceHolder > type instance XEOverLit (GhcPass 'Typechecked) = PlaceHolder > > type instance XXOverLit (GhcPass _) = PlaceHolder > ------------------- > > 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) > > The exact error message is > > ------------------------------ > Experiment.hs:34:1: error: > • Could not deduce (Data (XEOverLit (GhcPass p))) > arising from a use of ‘k’ > from the context: Data (GhcPass p) > bound by the instance declaration at Experiment.hs:34:1-69 > • In the first argument of ‘k’, namely ‘(z Experiment `k` a1)’ > In the expression: ((z Experiment `k` a1) `k` a2) > In an equation for ‘gfoldl’: > gfoldl k z Experiment a1 a2 = ((z Experiment `k` a1) `k` a2) > When typechecking the code for ‘gfoldl’ > in a derived instance for ‘Data (Experiment (GhcPass p))’: > To see the code I am typechecking, use -ddump-deriv > | > 34 | deriving instance (Data (GhcPass p)) => Data (Experiment (GhcPass p)) > | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > ------------------------------ > > Alan > > [1] http://lpaste.net/360017 > > >
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs