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

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -