Template Haskell [d| .. trouble

Marc Weber marco-oweber at gmx.de
Sat Jun 16 07:04:26 EDT 2007


Hi.

I've started using template haskell (replacing some preprocessor stuff)

However I had real trouble when trying to convert 
  instance (Show d) => Show (C d) 
    where show _ = "C " ++ (show (undefined :: d))

into th.
Why? It didn't compile (http://hpaste.org/289)

Heffalump on #haskell suggested that the d is already in scope so I
don't need the first list item of ForallT ..
And that does work fine.

So is this a bug in the [d| .. parser / to abstract syntax tree
transformer ?

Session showing this behviour:

  marc at localhost ~ $ cat ABC.hs
  {-# OPTIONS_GHC -fglasgow-exts #-}
  module ABC where
  data C d
  marc at localhost ~ $ ghci -fth
     ___         ___ _
    / _ \ /\  /\/ __(_)
   / /_\// /_/ / /  | |      GHC Interactive, version 6.6, for Haskell 98.
  / /_\\/ __  / /___| |      http://www.haskell.org/ghc/
  \____/\/ /_/\____/|_|      Type :? for help.

  Loading package base ... linking ... done.
  Prelude> :l ABC
  [1 of 1] Compiling ABC              ( ABC.hs, interpreted )
  Ok, modules loaded: ABC.
  *ABC> :m +Language.Haskell.TH
  *ABC Language.Haskell.TH> runQ [d| instance (Show d) => Show (C d) where show _ = "C " ++ (show (undefined :: d)) |] >>= print
  Loading package template-haskell ... linking ... done.
  [InstanceD [AppT (ConT GHC.Show.Show) (VarT d_0)] (AppT (ConT GHC.Show.Show) (AppT (ConT ABC.C) (VarT d_0))) [FunD show [Clause [WildP] (NormalB (InfixE (Just (LitE (StringL "C "))) (VarE GHC.Base.++) (Just (AppE (VarE show) (SigE (VarE GHC.Err.undefined) (ForallT [d_1] [] (VarT d_1))))))) []]]]
  *ABC Language.Haskell.TH>


  Now 
  (ForallT [d_1] [] (VarT d_1)
  should be
  (ForallT [] [] (VarT d_1)
  shouldn't it?


Marc Weber


More information about the Glasgow-haskell-users mailing list