
#14296: Add `Lift Exp` instance to `Language.Haskell.TH.Syntax` -------------------------------------+------------------------------------- Reporter: heisenbug | Owner: (none) Type: feature request | Status: new Priority: normal | Milestone: Component: Template Haskell | Version: 8.2.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Poor/confusing | Unknown/Multiple error message | Test Case: Blocked By: | Blocking: Related Tickets: #14030 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by heisenbug): Replying to [comment:2 RyanGlScott]:
However, it should be noted that a derived `Lift` instance for `Exp` would not produce the code above. The problem with that instance is that if `x :: Exp`, then `$(lift x)` would not necessarily equal `x` (or even be of type `Exp`!), which is a rule you'd generally expect to hold. (I realize this law isn't started anywhere in the Haddocks at the moment, but it probably should be.)
Interesting. I did not think about that too deeply. Maybe worth documenting this. But in my case (the specific usage in `[e|eqTypeRep (typeRep @ Maybe)|]`) the invariant is satisfied: `lift eqTypeRep` should encode an `Exp`. After all, I use it in this context `[p|($here -> Just HRefl)|]` as the view function. So I should be safe, right? Should I err, the type checker will remind me after quotation expansion, won't it? What about the derivation mechanism for `Lift` instances? Will it do ''the right thing'' in this case too? Anyway, thanks for the insight! -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14296#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler