Trees that Grow and constraints
Alan & Kim Zimmerman
alan.zimm at gmail.com
Mon Nov 13 14:05:46 UTC 2017
Just to clarify, this example is a simplification, in practice we would be
applying different type for each type instance
e.g.
type instance XEOverLit (GhcPass 'Parsed ) = PlaceHolder
type instance XEOverLit (GhcPass 'Renamed ) = PlaceHolder
type instance XEOverLit (GhcPass 'Typechecked) = Type
(modelling existing PostTc)
Alan
On 13 November 2017 at 11:23, Alan & Kim Zimmerman <alan.zimm at 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
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20171113/354c3b50/attachment.html>
More information about the ghc-devs
mailing list