
#14030: Implement the "Derive Lift instances for data types in template-haskell" proposal -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: RyanGlScott Type: task | Status: new Priority: normal | Milestone: 8.8.1 Component: Template Haskell | Version: 8.3 Resolution: | Keywords: deriving Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by RyanGlScott): Replying to [comment:8 harpocrates]:
the code that `Lift` will generate won't involve `conE`, `mkNameG_d`, etc. - it'll just be generating syntax for a bracket!
I'm not so sure. Nominally, yes, the generated code will only use the bracket syntax. But one must ask: what does the bracket syntax desugar down to? The answer may surprise you: {{{ λ> :set -ddump-simpl λ> data MyBool = F | T λ> deriving instance Lift MyBool ==================== Tidy Core ==================== Result size of Tidy Core = {terms: 38, types: 12, coercions: 3, joins: 0/0} -- RHS size: {terms: 21, types: 2, coercions: 0, joins: 0/0} $clift_r4ul :: MyBool -> Q Exp [GblId, Arity=1, Unf=OtherCon []] $clift_r4ul = \ (ds_d4um :: MyBool) -> case ds_d4um of { F -> Language.Haskell.TH.Lib.Internal.conE (mkNameG_d (GHC.CString.unpackCString# "interactive"#) (GHC.CString.unpackCString# "Ghci4"#) (GHC.CString.unpackCString# "F"#)); T -> Language.Haskell.TH.Lib.Internal.conE (mkNameG_d (GHC.CString.unpackCString# "interactive"#) (GHC.CString.unpackCString# "Ghci4"#) (GHC.CString.unpackCString# "T"#)) } -- RHS size: {terms: 1, types: 0, coercions: 3, joins: 0/0} interactive:Ghci5.$fLiftMyBool [InlPrag=INLINE (sat-args=0)] :: Lift MyBool [GblId[DFunId(nt)], Arity=1, Unf=OtherCon []] interactive:Ghci5.$fLiftMyBool = $clift_r4ul `cast` (Sym (Language.Haskell.TH.Syntax.N:Lift[0] <MyBool>_N) :: (MyBool -> Q Exp) ~R# Lift MyBool) }}} It turns out that bracket syntax desugars down to code that, in fact, uses `conE` and `mkNameG_d`! It's a bit more indirect, but I worry that there's the same potential for fragility. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14030#comment:9 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler