Include vs. Open
The include
and open
statements are quite similar, but they have
a subtly different effect on a structure. Consider this code:
module M = struct
let x = 0
end
module N = struct
include M
let y = x + 1
end
module O = struct
open M
let y = x + 1
end
If we enter that in the toplevel, we get the following response:
module M : sig val x : int end
module N : sig val x : int val y : int end
module O : sig val y : int end
Look closely at the values contained in each structure. N
has both
an x
and y
, whereas O
has only a y
. The reason is that
include M
causes all the definitions of M
to also be included in
N
, so the definition of x
from M
is present in N
. But open M
only made those definitions available in the scope of O
; it doesn't
actually make them part of the structure. So O
does not contain
a definition of x
, even though x
is in scope during the evaluation
of O
's definition of y
.
A metaphor for understanding this difference might be: open M
imports definitions from M
and makes them available for local
consumption, but they aren't exported to the outside world.
Whereas include M
imports definitions from M
, makes them
available for local consumption, and additionally exports
them to the outside world.