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.