logo       

"Could not unambiguously deduce"..: msg#00007

lang.haskell.glasgow.bugs

Subject: "Could not unambiguously deduce"..


I'm not actually sure whether this is a bug, but if it isn't,
could someone please enlighten me about what is going on?-)

[the following is a simplified version of a problem with instances
generated by Drift, for Strafunksi, where T would be the Drift
target, C would be Term, and expl(ode) would return TermRep]

------------

{-# OPTIONS -fglasgow-exts -fallow-overlapping-instances
-fallow-undecidable-instances #-}

module Main where

data T a = D [a]

class C t where
expl :: t -> String
expl x = "default"

instance C String where expl s = "String"
instance C a => C [a] where expl l = "[a]"

instance (C a {- ,C [a] -} ) => C (T a) where
expl (D xs) = expl xs

main = putStrLn $ expl "hi"

------------

As is, both ghc and hugs reject the program, whereas
both accept it with the extra constraint in the C (T a)
instance.. Now, I think I can see how the right-hand-side
expl could come either from the C String or from the C [a]
instance - hence ghc's message:

$ ghc --make Tst.hs
c:\ghc\ghc-5.04\bin\ghc.exe: chasing modules from: Tst.hs
Compiling Main ( Tst.hs, ./Tst.o )

Tst.hs:15:
Could not unambiguously deduce (C [a])
from the context (C (T a), C a)
The choice of (overlapping) instance declaration
depends on the instantiation of `a'
Probable fix:
Add (C [a]) to the class or instance method `expl'
Or add an instance declaration for (C [a])
arising from use of `expl' at Tst.hs:15
In the definition of `expl': expl xs

What I don't understand, however, is why adding that extra
constraint helps in any way? Shouldn't the addition of new
things in the context only make more options available? Why
does it make some of the existing, amgibuous options go away?

Confused,
Claus

PS. Perhaps related, but why does Hugs seem to ignore the
C a constraint in the context of the original version?

$ hugs -98 Tst.hs
__ __ __ __ ____ ___
_________________________________________
|| || || || || || ||__ Hugs 98: Based on the Haskell 98
standard
||___|| ||__|| ||__|| __|| Copyright (c) 1994-2001
||---|| ___|| World Wide Web:
http://haskell.org/hugs
|| || Report bugs to:
hugs-bugs@xxxxxxxxxxx
|| || Version: December 2001
_________________________________________

Hugs mode: Restart with command line option +98 for Haskell 98 mode

Reading file "c:\Program Files\Hugs98\\lib\Prelude.hs":
Reading file "Tst.hs":
Type checking
ERROR "Tst.hs":15 - Cannot justify constraints in instance member
binding
*** Expression : expl
*** Type : C (T a) => T a -> String
*** Given context : C (T a)
*** Constraints : C [a]

Prelude>


<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise