X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=docs%2Fusers_guide%2Fglasgow_exts.xml;h=ba18faf1403e2a895bf238cd693f7a02cd875998;hp=da61c6a3a5269ac03dbaf3f0cc3b295b69bfe42d;hb=b2020bada0e177105bf0fd3259850b9d645f1995;hpb=ea50f411373d21941bd387bb821bb8671266f178
diff --git a/docs/users_guide/glasgow_exts.xml b/docs/users_guide/glasgow_exts.xml
index da61c6a..ba18faf 100644
--- a/docs/users_guide/glasgow_exts.xml
+++ b/docs/users_guide/glasgow_exts.xml
@@ -3440,14 +3440,36 @@ Notice that we gave a type signature to f, so GHC had to
check that f has the specified type.
Suppose instead we do not give a type signature, asking GHC to infer
it instead. In this case, GHC will refrain from
-simplifying the constraint C Int [Int] (for the same reason
+simplifying the constraint C Int [b] (for the same reason
as before) but, rather than rejecting the program, it will infer the type
- f :: C Int b => [b] -> [b]
+ f :: C Int [b] => [b] -> [b]
That postpones the question of which instance to pick to the
call site for f
by which time more is known about the type b.
+You can write this type signature yourself if you use the
+
+flag.
+
+
+Exactly the same situation can arise in instance declarations themselves. Suppose we have
+
+ class Foo a where
+ f :: a -> a
+ instance Foo [b] where
+ f x = ...
+
+and, as before, the constraint C Int [b] arises from f's
+right hand side. GHC will reject the instance, complaining as before that it does not know how to resolve
+the constraint C Int [b], because it matches more than one instance
+declaration. The solution is to postpone the choice by adding the constraint to the context
+of the instance declaration, thus:
+
+ instance C Int [b] => Foo [b] where
+ f x = ...
+
+(You need to do this.)
The willingness to be overlapped or incoherent is a property of
@@ -3622,9 +3644,11 @@ to work since it gets translated into an equality comparison.
The context of a type signature
-Unlike Haskell 98, constraints in types do not have to be of
-the form (class type-variable) or
-(class (type-variable type-variable ...)). Thus,
+The flag lifts the Haskell 98 restriction
+that the type-class constraints in a type signature must have the
+form (class type-variable) or
+(class (type-variable type-variable ...)).
+With
these type signatures are perfectly OK
g :: Eq [a] => ...