X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=docs%2Fusers_guide%2Fseparate_compilation.xml;h=fc22fbdef3c4c88fa578140e897d5fccfd658221;hb=0093a2827f6b4007c4fcb298a559c9b7dd17aec1;hp=58726e56d23f6f176947362fea9cbef948743034;hpb=8215287c8c8d19dff36cd20ef71d56341a769d50;p=ghc-hetmet.git
diff --git a/docs/users_guide/separate_compilation.xml b/docs/users_guide/separate_compilation.xml
index 58726e5..fc22fbd 100644
--- a/docs/users_guide/separate_compilation.xml
+++ b/docs/users_guide/separate_compilation.xml
@@ -595,9 +595,9 @@ $ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`
- Where file is the name of
+ where file is the name of
an interface file, dumps the contents of that interface in
- a human-readable (ish) format.
+ a human-readable (ish) format. See .
@@ -703,7 +703,7 @@ module B where
Here A imports B, but B imports
A with a {-# SOURCE #-} pragma, which breaks the
circular dependency. For every module A.hs that is {-# SOURCE #-}-imported
-in this way there must exist a souce file A.hs-boot. This file contains an abbreviated
+in this way there must exist a source file A.hs-boot. This file contains an abbreviated
version of A.hs, thus:
module A where
@@ -1040,7 +1040,7 @@ ghc -M -optdep-f -optdep.depend ...
- Print a full list of the module depenencies to stdout.
+ Print a full list of the module dependencies to stdout.
(This is the standard verbosity flag, so the list will
also be displayed with and
;
@@ -1184,8 +1184,31 @@ and GHC has no other reason for visiting the module. Example:
class C a where ...
Here, neither D nor T is declared in module Orphan.
-We call such modules “orphan modules”,
-defined thus:
+We call such modules “orphan modules”.
+GHC identifies orphan modules, and visits the interface file of
+every orphan module below the module being compiled. This is usually
+wasted work, but there is no avoiding it. You should therefore do
+your best to have as few orphan modules as possible.
+
+
+Functional dependencies complicate matters. Suppose we have:
+
+ module B where
+ instance E T Int where ...
+ data T = ...
+
+Is this an orphan module? Apparently not, because T
+is declared in the same module. But suppose class E had a
+functional dependency:
+
+ module Lib where
+ class E x y | y -> x where ...
+
+Then in some importing module M, the constraint (E a Int) should be "improved" by setting
+a = Int, even though there is no explicit mention
+of T in M.
+
+These considerations lead to the following definition of an orphan module:
An orphan moduleorphan module
@@ -1193,12 +1216,21 @@ defined thus:
least one orphan rule. An instance declaration in a module M is an orphan instance if
- orphan instance
- none of the type constructors
- or classes mentioned in the instance head (the part after the “=>”) are declared
- in M.
-
- Only the instance head counts. In the example above, it is not good enough for C's declaration
+ orphan instance
+
+
+ The class of the instance declaration is not declared in M, and
+
+
+Either the class has no functional dependencies, and none of the type constructors
+ in the instance head is declared in M; or there
+ is a functional dependency for which none of the type constructors mentioned
+ in the non-determined part of the instance head is defined in M.
+
+
+
+ Only the instance head (the part after the “=>”)
+ counts. In the example above, it is not good enough for C's declaration
to be in module A; it must be the declaration of D or T.
@@ -1210,16 +1242,11 @@ defined thus:
- GHC identifies orphan modules, and visits the interface file of
-every orphan module below the module being compiled. This is usually
-wasted work, but there is no avoiding it. You should therefore do
-your best to have as few orphan modules as possible.
-
-
- You can identify an orphan module by looking in its interface
+GHC will warn you if you are creating an orphan module, if you add `-fwarn-orphan-modules`.
+You can identify an orphan module by looking in its interface
file, M.hi, using the
-. If there is a “!” on the
+ mode. If there is a [orphan module] on the
first line, GHC considers it an orphan module.