Terrible error message when given and wanted are both insoluble
In fixing the ambiguity check I came across this tricky program
data T a b where
MkT :: (a~Maybe b) => a -> Maybe b -> T a b
f :: T a a -> Bool
f (MkT x y) = [x,y] `seq` True
We get an error message
Frozen2.hs:12:18:
Could not deduce (a ~ Maybe a)
from the context (a ~ Maybe a)
bound by a pattern with constructor
MkT :: forall a b. a ~ Maybe b => a -> Maybe b -> T a b,
in an equation for `f'
at Frozen2.hs:12:4-10
`a' is a rigid type variable bound by
the type signature for f :: T a a -> Bool at Frozen2.hs:11:6
Relevant bindings include
f :: T a a -> Bool (bound at Frozen2.hs:12:1)
x :: a (bound at Frozen2.hs:12:8)
y :: Maybe a (bound at Frozen2.hs:12:10)
In the expression: y
In the first argument of `seq', namely `[x, y]'
In the expression: [x, y] `seq` True
This error message is nonsense! It arises becuase the "insolubles" get both a "given" insoluble (a~T a) and a "wanted" insoluble with the same type.
This can also arise, rather more easily, with the new ambiguity check, via an inaccessible context
foo :: forall a. (a ~ T a) => a -> a
It's a bit obscure, but it needs fixing.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.6.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |