Template Haskell Show instance not working -
does know why code:
module language.p4.utiltest import language.p4.util (mkshow) data dummy = bogus char | nonsense int $(mkshow ''dummy)
is producing error:
davids-air-2:p4 dbanas$ stack ghc -- utiltest.hs -ddump-splices [1 of 1] compiling language.p4.utiltest ( utiltest.hs, utiltest.o ) utiltest.hs:24:3-16: splicing declarations mkshow ''dummy ======> instance show dummy show (bogus x) = show x show (nonsense x) = show x utiltest.hs:24:3: error: conflicting definitions ‘show’ bound at: utiltest.hs:24:3-16 utiltest.hs:24:3-16 | 24 | $(mkshow ''dummy) | ^^^^^^^^^^^^^^
?
the th splice expansion looks correct me. if comment out second constructor (nonsense int
), code compiles without error. also, if enter th splice expansion shown, manually, code (commenting out $(mkshow ''dummy)
line, of course), compiles without error.
mkshow :: name -> q [dec] mkshow typname = t@(tyconi (datad _ _ _ _ constructors _)) <- reify typname -- information on type. let func_name = mkname "show" let var_name = mkname "x" let func_decs = map ( \c@(normalc nm _) -> fund func_name [ clause [conp (simplename nm) [varp var_name]] (normalb (appe (vare func_name) (vare var_name))) [] ] ) constructors return [instanced nothing [] (appt (cont (mkname "show")) (cont (simplename typname))) func_decs] simplename :: name -> name simplename nm = let s = namebase nm in case dropwhile (/=':') s of [] -> mkname s _:[] -> mkname s _:t -> mkname t
comment @user2407038, above, gives answer. here corrected code mkshow():
mkshow :: name -> q [dec] mkshow typname = t@(tyconi (datad _ _ _ _ constructors _)) <- reify typname -- information on type. let func_name = mkname "show" let var_name = mkname "x" let clause_decs = map ( \c@(normalc nm _) -> clause [conp (simplename nm) [varp var_name]] (normalb (appe (vare func_name) (vare var_name))) [] ) constructors return [instanced nothing [] (appt (cont (mkname "show")) (cont (simplename typname))) [fund func_name clause_decs]]
Comments
Post a Comment