resolving Show instance

Serge D. Mechveliani mechvel at botik.ru
Thu Jun 30 06:57:46 EDT 2005


Who knows, please, why does there happen, now and then, the effects 
of the following kind?

The  ghc-6-4-branch-June-15-2005  compiler cannot resolve the  Show  
instances in the following program
(using overlapping and `undecidable' instances):

-------------------------------------------
import Dumatel
main = putStr (shows path $  shows (subterm path t) "\n")
  where
  th = bool defaultVariableWeight defaultInitialOpId weightDecls lpo
                                                    where
                                                    weightDecls = []

  t = parseSingleOrBreak th "bool"  "x & (not x)"    :: Term

  path = []   -- :: SubtermPath
-------------------------------------------


It cannot choose the Show instance for  path = [].
But 
1) the above `putStr' line contains a subexpression
                                        shows (subterm path t) "\n", 

2) the imported modules contain the declarations

   subterm :: SubtermPath -> Term -> Term
   ...
   type SubtermPath = [Integer]

Hence, it should derive the type for  path :  [Integer].

Also setting            path = [1]
or                      path = []  :: SubtermPath
instead of the line
                        path = []
satisfies the compiler.

This is not a problem for me to guess to add  `:: SubtermPath'.
This is a question of curiosity. 
The compiler sees to which function `path' is fed to, and sees the 
argument types of this function. Hence, why does not it find the 
type for `path' ?

I am sure that much simpler example is possible
(the imported universe is complex), maybe even without overlaps.
But maybe, people can explain the effect right for this example as 
it is?
The report is

------------------------------------------
  Overlapping instances for Show [a]
      arising from use of `shows' at GHCBug.hs:5:15-19
    Matching instances:
      Imported from GHC.Show: instance (Show a) => Show [a]
      Imported from Prelude3: instance Show [Equation]
      Imported from Prelude3: instance Show [Term]
    (The choice depends on the instantiation of `a'
     Use -fallow-incoherent-instances to use the first choice above)
    In the first argument of `($)', namely `shows path'
    In the first argument of `putStr', namely
        `((shows path) $ (shows (subterm path t) "\n"))'
    In the definition of `main':
      main = putStr ((shows path) $ (shows (subterm path t) "\n"))
          where
          path = []
          th = bool defaultVariableWeight defaultInitialOpId weightDecls lpo
                 where
                 weightDecls = []
                 t = parseSingleOrBreak th "bool" "x & (not x)" :: Term
--------------------------------------------------------


Thank you in advance for explanations.

-----------------
Serge Mechveliani
mechvel at botik.ru


More information about the Glasgow-haskell-users mailing list