[GHC] #7437: peculiar behaviour with default instances and type variables
GHC
cvs-ghc at haskell.org
Thu Nov 22 10:42:14 CET 2012
#7437: peculiar behaviour with default instances and type variables
---------------------------------+------------------------------------------
Reporter: bos | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.1
Keywords: | Os: Unknown/Multiple
Architecture: Unknown/Multiple | Failure: GHC accepts invalid program
Difficulty: Unknown | Testcase:
Blockedby: | Blocking:
Related: |
---------------------------------+------------------------------------------
Changes (by simonpj):
* difficulty: => Unknown
Comment:
Here is what is going on. When you replace the second sig for `default
put` with the first, the type of the generic default method becomes
{{{
$gdmput :: forall a. Put a => forall t. (Generic t, GPut (Rep t)) => t
-> [()]
}}}
and this is indeed ambiguous. But the error message is unhelpful
{{{
T7437.hs:11:1:
Ambiguous constraint `Put a'
At least one of the forall'd type variables mentioned by the
constraint
must be reachable from the type after the '=>'
When checking the class method: put :: a -> [()]
In the class declaration for `Put'
}}}
Second, as things stand when you add `FlexibleInstances` that suppresses
the ambiguity check (see `Note [The ambiguity check for type signatures]`
in `TcMType.lhs`). So instetad you get ambiguity where the generic defaul
method is called. The `instance Put Foo` really means
{{{
instance Put Foo where
put = $gdmput
}}}
and so you get
{{{
T7437.hs:27:10:
No instance for (Put a0) arising from a use of `T7437.$gdmput'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there is a potential instance available:
instance Put Foo -- Defined at T7437.hs:27:10
In the expression: (T7437.$gdmput)
In an equation for `put': put = (T7437.$gdmput)
In the instance declaration for `Put Foo'
}}}
Things for me (or someone) to think about
* Improve the context info for the first message, which should at least
give the ambiguous type.
* Improve the ambiguity check, which is very crude at the moment. The
ambiguity check that is used for ''infered'' types is this. Given `f = e`
in you infer the type `f :: type`, then would this type check?
{{{
g :: type
g = f
}}}#
The ambiguity check for ''declared'' type should be the same, and it
isn't.
So this does not look urgent but clear rooom for improvement. Thanks for
reporting.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7437#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the Glasgow-haskell-bugs
mailing list