
path gets the inferred type path :: forall a. [a] This polymorphic type is instantiated once when it is passed to 'subterm' and again, quite separately, when it is passed to 'shows'. Simon | -----Original Message----- | From: glasgow-haskell-users-bounces@haskell.org [mailto:glasgow-haskell-users- | bounces@haskell.org] On Behalf Of Serge D. Mechveliani | Sent: 30 June 2005 11:58 | To: glasgow-haskell-users@haskell.org | Subject: resolving Show instance | | 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@botik.ru | _______________________________________________ | Glasgow-haskell-users mailing list | Glasgow-haskell-users@haskell.org | http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Now I see that, probably, GHC is correct. Thank you. On Jun 30, 2005, Simon Peyton-Jones wrote:
path gets the inferred type path :: forall a. [a]
This polymorphic type is instantiated once when it is passed to 'subterm' and again, quite separately, when it is passed to 'shows'.
| 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 | [..] | t = [..] | | path = [] -- :: SubtermPath | -------------------------------------------
participants (2)
-
Serge D. Mechveliani
-
Simon Peyton-Jones