Include and open seem very similar at first, and they do have similarities, but also many differences. Here's a simple example. Let's define a module M:
module M = struct
let x = 0
end
module M : sig val x : int end
Okay, now let's implement N and M, including and opening M respectfully:
module N = struct
include M
let y = x + 1
end
module O = struct
open M
let y = x + 1
end
module N : sig val x : int val y : int end
module O : sig val y : int end
Note that these modules have different signatures! Module N has two values, x and y, while module O has one value, just y.
Include is including all the definitions from module N in M; however, we open rather than include. We open them for use internally, but we don't export them.
open MMinclude MM