| Thanks. That helps but I still don't understand why the calls are | delegated to template-haskell library. Couldn't all of this be done | locally?
No. If you have f :: Int -> Q Exp then f is a function that, when run, produces a data structure that is the syntax tree (in the data type of Language.Haskell.TH) of some expression. Later, in some other module entirely, you may call f, thus foo = $(f 5) Now GHC dynamically links the module that defines f, executes f's code, which returns a syntax tree (in the data type of Language.Haskell.TH). This is converted to HsSyn and replaces the $(f 5). So the code for f must be code that, when executed, produces a data structure. The business of DsMeta is to produce such code. If, once you grok this, you'd like to add a page to the GHC Commentary, to explain it, that would be great. It does take a while to get your head around. Simon | -----Original Message----- | From: ghc-devs [mailto:ghc-devs-boun...@haskell.org] On Behalf Of Jan | Stolarek | Sent: 17 December 2014 19:34 | To: Richard Eisenberg | Cc: ghc-devs@haskell.org | Subject: Re: Understanding DsMeta module | | Thanks. That helps but I still don't understand why the calls are | delegated to template-haskell library. Couldn't all of this be done | locally? | | Janek | | Dnia środa, 17 grudnia 2014, Richard Eisenberg napisał: | > On Dec 17, 2014, at 12:29 PM, Jan Stolarek <jan.stola...@p.lodz.pl> | wrote: | > > Why not implement repPlainTV like this: ? | > > | > > repPlainTV :: Core TH.Name -> DsM (Core TH.TyVarBndr) repPlainTV | > > (MkC nm) = return $ MkC (TH.PlainTV nm) | > | > In short, that's ill typed. We have | > | > > newtype Core a = MkC CoreExpr | > | > The idea behind this type is that its (phantom) type parameter | tracks | > the type of the expression stored within. Of course, the thing | within | > is always just a core expression. TH.PlainTV takes a TH.Name and | > produces a TH.TyVarBndr. But, nm is a CoreExpr and MkC is expecting | a | > CoreExpr, so your suggestion wouldn't type check. | > | > The higher-level answer is that you're mixing levels. The goal in | > DsMeta is | > *not* to create the TH AST. It's to create *core expressions* that | > create the TH AST. | > | > Does this help? | > | > Richard | | | _______________________________________________ | ghc-devs mailing list | ghc-devs@haskell.org | http://www.haskell.org/mailman/listinfo/ghc-devs _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://www.haskell.org/mailman/listinfo/ghc-devs