X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=docs%2Fusers_guide%2Fglasgow_exts.xml;h=4fbd08c5c41326775b9ceebde0de78cba6d7a75c;hb=d7df1559b3f44603e78062e9eed5c13a453aa7f4;hp=1881ff00312272a3c7dd4163b1c3d2f98da55874;hpb=970d5b88b1554bbdd7e459dae41aab3668ae897a;p=ghc-hetmet.git
diff --git a/docs/users_guide/glasgow_exts.xml b/docs/users_guide/glasgow_exts.xml
index 1881ff0..4fbd08c 100644
--- a/docs/users_guide/glasgow_exts.xml
+++ b/docs/users_guide/glasgow_exts.xml
@@ -962,6 +962,48 @@ definitions; you must define such a function in prefix form.
+
+Record field disambiguation
+
+In record construction and record pattern matching
+it is entirely unambiguous which field is referred to, even if there are two different
+data types in scope with a common field name. For example:
+
+module M where
+ data S = MkS { x :: Int, y :: Bool }
+
+module Foo where
+ import M
+
+ data T = MkT { x :: Int }
+
+ ok1 (MkS { x = n }) = n+1 -- Unambiguous
+
+ ok2 n = MkT { x = n+1 } -- Unambiguous
+
+ bad1 k = k { x = 3 } -- Ambiguous
+ bad2 k = x k -- Ambiguous
+
+Even though there are two x's in scope,
+it is clear that the x in the pattern in the
+definition of ok1 can only mean the field
+x from type S. Similarly for
+the function ok2. However, in the record update
+in bad1 and the record selection in bad2
+it is not clear which of the two types is intended.
+
+
+Haskell 98 regards all four as ambiguous, but with the
+ flag, GHC will accept
+the former two. The rules are precisely the same as those for instance
+declarations in Haskell 98, where the method names on the left-hand side
+of the method bindings in an instance declaration refer unambiguously
+to the method of that class (provided they are in scope at all), even
+if there are other variables in scope with the same name.
+This reduces the clutter of qualified names when you import two
+records from different modules that use the same field name.
+
+
@@ -4262,7 +4304,7 @@ Tim Sheard is going to expand it.)
the quotation has type Expr.
[d| ... |], where the "..." is a list of top-level declarations;
the quotation has type Q [Dec].
- [Planned, but not implemented yet.] [t| ... |], where the "..." is a type;
+ [t| ... |], where the "..." is a type;
the quotation has type Type.