This typechecks: instance Lift a => Lift (Q a) where lift :: Q a -> Q Exp lift x = join (fmap lift x)
And it looks correct. Do you agree? In general, it sounds like you've thought this through. To me, this doesn't rise to the need of a ghc-proposal; I would say to go for it. Richard > On Jan 25, 2019, at 6:56 AM, Matthew Pickering <[email protected]> > wrote: > > I don't think that cross stage persistence will work as it is > currently implemented which is probably why the check exists. > > 1. The normal case > > foo x = [| x |] ===> > foo x = [| $(lift x) |] > > 2. x is defined at stage 0, and used at stage 2. > > One option is: > foo x = [| [| x |] |] ===> > foo x = [| [| $($(lift (lift x))) |] |] > or > foo x = [| [| x |] |] ===> > foo x = [| let x' = $(lift x) in [| $(lift [| x' |]) |] > > We need to think a bit how to `lift` something of type `Q Exp` because > of the `Q` monad. Lifting an `Exp` seems trivial as it's a normal ADT > (I tested and this works after deriving 40 instances). > > You can define `lift2` which lifts an expression twice as follows. > > ``` > lift2 :: Lift a => a -> Q Exp > lift2 a = lift a >>= \e -> [| return $ $(lift e) |] > ``` > > 3. x is defined at stage 1 and used in stage 2 > > foo = [| \x -> [| x |] |] ===> > foo = [| \x -> [| $(lift x) |] |] > > Desugared with a single call to `lift` like normal. > > 4. x is defined in stage 2 and used in stage 1 > > foo = [| [| \x -> $(x) |] |] > > Rejected just like usual. `x` won't be bound when the splice is run. > > It seems that with some suitable care that things will work out when > lifting across multiple levels but that is the point where care needs > to be taken. > > Matt > > > > On Thu, Jan 24, 2019 at 5:46 PM Richard Eisenberg <[email protected]> > wrote: >> >> I think Geoff was primarily concerned with typed Template Haskell, not the >> untyped variety. >> >> I, too, have wondered if there was a technical reason behind this >> restriction, or if merely it was assumed that nested brackets were not >> worthwhile. >> >> One question: how would staging work between nesting levels of brackets? >> >> Richard >> >>> On Jan 24, 2019, at 12:42 PM, Ben Gamari <[email protected]> wrote: >>> >>> Matthew Pickering <[email protected]> writes: >>> >>>> There is a check in `RnSplice` which errors on the following program >>>> with nested brackets. >>>> >>> It might be good to explicitly include Geoff Mainland in this thread. >>> I'm not sure he'll see it otherwise. >>> >>> Cheers, >>> >>> - Ben >>> >>> _______________________________________________ >>> ghc-devs mailing list >>> [email protected] >>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs >> _______________________________________________ ghc-devs mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
