
Hi all, Learning Template Haskell, I try to understand what happens when experimenting in ghci: $ ghci -XTemplateHaskell
:m + Language.Haskell.TH runQ [| \x -> 1 |] LamE [VarP x_0] (LitE (IntegerL 1))
Indeed, we have:
:t runQ [| \x -> 1 |] runQ [| \x -> 1 |] :: Language.Haskell.TH.Syntax.Quasi m => m Exp
where m is any monad instance of Language.Haskell.TH.Syntax.Quasi. I believed that to be able to print a value in ghci, its type has to be an instance of Show. But `Exp` is an instance of Show, not `m Exp`:
:i Show [...] -- Defined in `Language.Haskell.TH.Syntax' instance Show Fixity -- Defined in `Language.Haskell.TH.Syntax' instance Show FamFlavour -- Defined in `Language.Haskell.TH.Syntax' instance Show Exp -- Defined in `Language.Haskell.TH.Syntax' instance Show Dec -- Defined in `Language.Haskell.TH.Syntax' instance Show Con -- Defined in `Language.Haskell.TH.Syntax' instance Show Clause -- Defined in `Language.Haskell.TH.Syntax' instance Show Callconv -- Defined in `Language.Haskell.TH.Syntax' instance Show Body -- Defined in `Language.Haskell.TH.Syntax' instance Show Float -- Defined in `GHC.Float' instance Show Double -- Defined in `GHC.Float'
So, how does gchi print `runQ [| \x -> 1 |]`? Thanks in advance, TP