Typechecker / OverloadedStrings question 7.8 vs. 7.10

Daniel Bergey bergey at teallabs.org
Fri Jul 31 01:23:18 UTC 2015

On 2015-07-30 at 21:39, Michael Karg <mgoremeier at gmail.com> wrote:
> I guess without that pragma, the string literals already imply t ~ [] for
> Foldable t.

You're basically right.  Without OverloadedStrings, a string literal
("foo") is always a String.  With OverloadedStrings, it's free to be
any t such that IsString t.  (But it's expected to have a monomorphic
type, not the polymorphic "foo" :: forall t. IsString t => t)

Hence the second error below - GHC tries to pick a type that is both
Foldable and IsString, but that's not a unique combination.

>> GHC 7.10 fails with the following errors (whereas 7.8 compiles without
>> complaining):
>> ghc --make "Testcase.hs"
>> [1 of 1] Compiling Main             ( Testcase.hs, Testcase.o )
>> Testcase.hs:7:31:
>>     No instance for (Foldable t0) arising from a use of ‘elem’
>>     The type variable ‘t0’ is ambiguous
>>    (...)
>> Testcase.hs:8:15:
>>     No instance for (Data.String.IsString (t0 Char))
>>       arising from the literal ‘"$_-"’
>>     The type variable ‘t0’ is ambiguous
>>     (...)

Question for GHC devs:

How hard would it be to give a different error message instead of "No
instance ..." when the type variable is ambiguous?  I always find this
error slightly misleading, since it seems to me that there are multiple
valid instances, not that there is "no instance".


More information about the ghc-devs mailing list