X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=docs%2Fusers_guide%2Fseparate_compilation.xml;h=1bdb0c5344d716cf7ef2410950a16c8f1d514c0c;hb=9d03becc597e5b1ab6c8466209a1263bf8ba6f29;hp=c33ff2175b6935222206bdb4b5e0b3f6f3aefc1c;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git
diff --git a/docs/users_guide/separate_compilation.xml b/docs/users_guide/separate_compilation.xml
index c33ff21..1bdb0c5 100644
--- a/docs/users_guide/separate_compilation.xml
+++ b/docs/users_guide/separate_compilation.xml
@@ -114,7 +114,9 @@
has been specified, then the object filename is
dir/mod.osuf,
where mod is the module name with
- dots replaced by slashes.
+ dots replaced by slashes. GHC will silently create the necessary directory
+ structure underneath dir, if it does not
+ already exist.
@@ -182,7 +184,7 @@
dots replaced by the directory separator ('/' or '\', depending
on the system), and extension is a
source extension (hs, lhs)
- if we are in mode and GHCi, or
+ if we are in mode or GHCi, or
hisuf otherwise.
For example, suppose the search path contains directories
@@ -218,7 +220,7 @@
This isn't the whole story: GHC also looks for modules in
pre-compiled libraries, known as packages. See the section on
- packages (), for details.
+ packages () for details.
@@ -434,7 +436,9 @@ $ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`
+ ,
+
@@ -449,7 +453,9 @@ $ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`
+ ,
+
@@ -459,7 +465,9 @@ $ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`
+ ,
+
@@ -587,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 .
@@ -603,9 +611,9 @@ $ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`
-
-
-
+
+
+ Turn off recompilation checking (which is on by
@@ -694,8 +702,11 @@ module B where
hi-boot files
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
+circular dependency. Every loop in the module import graph must be broken by a {-# SOURCE #-} import;
+or, equivalently, the module import graph must be acyclic if {-# SOURCE #-} imports are ignored.
+
+For every module A.hs that is {-# SOURCE #-}-imported
+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
@@ -704,7 +715,7 @@ module A where
To compile these three files, issue the following commands:
- ghc -c A.hs-boot -- Poduces A.hi-boot, A.o-boot
+ ghc -c A.hs-boot -- Produces A.hi-boot, A.o-boot
ghc -c B.hs -- Consumes A.hi-boot, produces B.hi, B.o
ghc -c A.hs -- Consumes B.hi, produces A.hi, A.o
ghc -o foo A.o B.o -- Linking the program
@@ -770,7 +781,7 @@ When a hs-boot file A.hs-boot A module M that is
{-# SOURCE #-}-imported in a program will usually also be
ordinarily imported elsewhere. If not, ghc --make
- automatically adds M to the set of moudles it tries to
+ automatically adds M to the set of modules it tries to
compile and link, to ensure that M's implementation is included in
the final program.
@@ -810,18 +821,20 @@ can be given abstractly, by omitting the '=' sign and everything that follows.
it out precisely as in its real definition.
If you do not write out the constructors, you may need to give a kind
- annotation (), to tell
+ annotation (), to tell
GHC the kind of the type variable, if it is not "*". (In source files, this is worked out
from the way the type variable is used in the constructors.) For example:
data R (x :: * -> *) y
+You cannot use deriving on a data type declaration; write an
+instance declaration instead.
Class declarations is exactly as in Haskell, except that you may not put
-default method declarations. You can also omit all the class methods entirely.
+default method declarations. You can also omit all the superclasses and class
+methods entirely; but you must either omit them all or put them all in.
- Do not include instance declarations. There is a complication to do with
-how the dictionary functions are named. It may well work, but it's not a well-tested feature.
+ You can include instance declarations just as in Haskell; but omit the "where" part.
@@ -911,11 +924,11 @@ Foo.o Foo.hc Foo.s : Baz.hi # Foo imports Baz
make looks for a rule to do so; one of the
preceding suffix rules does the job nicely. These dependencies
can be generated automatically by ghc; see
-
+
-
+ Dependency generationdependencies in MakefilesMakefile dependencies
@@ -1012,6 +1025,15 @@ ghc -M -optdep-f -optdep.depend ...
+
+
+ Display a list of the cycles in the module graph. This is
+ useful when trying to eliminate such cycles. You do not need the -optdep prefix
+ for this flag.
+
+
+
+ Turn off warnings about interface file shadowing.
@@ -1021,7 +1043,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
;
@@ -1096,6 +1118,7 @@ ghc -M -optdep-f -optdep.depend ...
+
@@ -1163,8 +1187,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
@@ -1172,12 +1219,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.
@@ -1189,17 +1245,12 @@ 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 first line,
-GHC considers it an orphan module.
+ mode. If there is a [orphan module] on the
+first line, GHC considers it an orphan module.