# module C = Char # - : char = 'B' # module C' : sig external code : char -> int = "%identity" val chr : int -> char val escaped : char -> string val lowercase : char -> char val uppercase : char -> char val lowercase_ascii : char -> char val uppercase_ascii : char -> char type t = char val compare : t -> t -> int val equal : t -> t -> bool external unsafe_chr : int -> char = "%identity" end # - : char = 'B' # module C3 : sig external code : char -> int = "%identity" val chr : int -> char val escaped : char -> string val lowercase : char -> char val uppercase : char -> char val lowercase_ascii : char -> char val uppercase_ascii : char -> char type t = char val compare : t -> t -> int val equal : t -> t -> bool external unsafe_chr : int -> char = "%identity" end # - : char = 'B' # val f : 'a list -> int = # val g : int list -> int = # module F : functor (X : sig end) -> sig external code : char -> int = "%identity" val chr : int -> char val escaped : char -> string val lowercase : char -> char val uppercase : char -> char val lowercase_ascii : char -> char val uppercase_ascii : char -> char type t = char val compare : t -> t -> int val equal : t -> t -> bool external unsafe_chr : int -> char = "%identity" end # module C4 : sig external code : char -> int = "%identity" val chr : int -> char val escaped : char -> string val lowercase : char -> char val uppercase : char -> char val lowercase_ascii : char -> char val uppercase_ascii : char -> char type t = char val compare : t -> t -> int val equal : t -> t -> bool external unsafe_chr : int -> char = "%identity" end # - : char = 'B' # module G : functor (X : sig end) -> sig module M : sig end end # module M : sig module M : sig end end # module M' : sig module N : sig val x : int end module N' = N end # - : int = 1 # module M'' : sig module N' : sig val x : int end end # - : int = 1 # module M2 : sig module N = M'.N module N' = M'.N' end # module M3 : sig module N' : sig val x : int end end # - : int = 1 # module M3' : sig module N' : sig val x : int end end # - : int = 1 # module M4 : sig module N' : sig val x : int end end # - : int = 1 # module F : functor (X : sig end) -> sig module N : sig val x : int end module N' = N end # module G : functor (X : sig end) -> sig module N' : sig val x : int end end # module M5 : sig module N' : sig val x : int end end # - : int = 1 # module M : sig module D : sig val y : int end module N : sig val x : int end module N' = N end # module M1 : sig module N : sig val x : int end module N' = N end # - : int = 1 # module M2 : sig module N' : sig val x : int end end # - : int = 1 # # - : int = 1 # module M : sig module C = Char module C' = C end # module M1 : sig module C : sig val escaped : char -> string end module C' = C end # - : string = "A" # module M2 : sig module C' : sig val chr : int -> char end end # - : char = 'B' # - : f:('a -> 'b) -> 'a list -> 'b list = # module Q = Queue # exception QE # - : string = "Ok" # module type Complex = sig type t = Complex.t = { re : float; im : float; } val zero : t val one : t val i : t val neg : t -> t val conj : t -> t val add : t -> t -> t val sub : t -> t -> t val mul : t -> t -> t val inv : t -> t val div : t -> t -> t val sqrt : t -> t val norm2 : t -> float val norm : t -> float val arg : t -> float val polar : float -> float -> t val exp : t -> t val log : t -> t val pow : t -> t -> t end # module M : sig module C : Complex end # module C = Complex # - : float = 1. # type t = Complex.t = { re : float; im : float; } val zero : t = {re = 0.; im = 0.} val one : t = {re = 1.; im = 0.} val i : t = {re = 0.; im = 1.} val neg : t -> t = val conj : t -> t = val add : t -> t -> t = val sub : t -> t -> t = val mul : t -> t -> t = val inv : t -> t = val div : t -> t -> t = val sqrt : t -> t = val norm2 : t -> float = val norm : t -> float = val arg : t -> float = val polar : float -> float -> t = val exp : t -> t = val log : t -> t = val pow : t -> t -> t = # module F : functor (X : sig module C = Char end) -> sig module C = Char end # module S = String module StringSet : sig type elt = String.t type t = Set.Make(String).t val empty : t val is_empty : t -> bool val mem : elt -> t -> bool val add : elt -> t -> t val singleton : elt -> t val remove : elt -> t -> t val union : t -> t -> t val inter : t -> t -> t val diff : t -> t -> t val compare : t -> t -> int val equal : t -> t -> bool val subset : t -> t -> bool val iter : (elt -> unit) -> t -> unit val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a val for_all : (elt -> bool) -> t -> bool val exists : (elt -> bool) -> t -> bool val filter : (elt -> bool) -> t -> t val partition : (elt -> bool) -> t -> t * t val cardinal : t -> int val elements : t -> elt list val min_elt : t -> elt val max_elt : t -> elt val choose : t -> elt val split : elt -> t -> t * bool * t val find : elt -> t -> elt val of_list : elt list -> t end module SSet : sig type elt = S.t type t = Set.Make(S).t val empty : t val is_empty : t -> bool val mem : elt -> t -> bool val add : elt -> t -> t val singleton : elt -> t val remove : elt -> t -> t val union : t -> t -> t val inter : t -> t -> t val diff : t -> t -> t val compare : t -> t -> int val equal : t -> t -> bool val subset : t -> t -> bool val iter : (elt -> unit) -> t -> unit val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a val for_all : (elt -> bool) -> t -> bool val exists : (elt -> bool) -> t -> bool val filter : (elt -> bool) -> t -> t val partition : (elt -> bool) -> t -> t * t val cardinal : t -> int val elements : t -> elt list val min_elt : t -> elt val max_elt : t -> elt val choose : t -> elt val split : elt -> t -> t * bool * t val find : elt -> t -> elt val of_list : elt list -> t end # val f : StringSet.t -> SSet.t = # module F : functor (M : sig end) -> sig type t end module T : sig module M : sig end type t = F(M).t end # module M = T.M type t = F(M).t # val f : t -> T.t = # module A : sig module B : sig type t val compare : 'a -> 'b -> int end module S : sig type elt = B.t type t = Set.Make(B).t val empty : t val is_empty : t -> bool val mem : elt -> t -> bool val add : elt -> t -> t val singleton : elt -> t val remove : elt -> t -> t val union : t -> t -> t val inter : t -> t -> t val diff : t -> t -> t val compare : t -> t -> int val equal : t -> t -> bool val subset : t -> t -> bool val iter : (elt -> unit) -> t -> unit val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a val for_all : (elt -> bool) -> t -> bool val exists : (elt -> bool) -> t -> bool val filter : (elt -> bool) -> t -> t val partition : (elt -> bool) -> t -> t * t val cardinal : t -> int val elements : t -> elt list val min_elt : t -> elt val max_elt : t -> elt val choose : t -> elt val split : elt -> t -> t * bool * t val find : elt -> t -> elt val of_list : elt list -> t end val empty : S.t end module A1 = A # - : bool = true # module FF : functor (X : sig end) -> sig type t end module M : sig module X : sig end module Y : sig type t = FF(X).t end type t = Y.t end module F : functor (Y : sig type t end) (M : sig type t = Y.t end) -> sig end # module G : functor (M : sig type t = M.Y.t end) -> sig end # * module A1 : sig end module A2 : sig end module L1 : sig module X = A1 end module L2 : sig module X = A2 end # module F : functor (L : sig module X : sig end end) -> sig end # module F1 : sig end # module F2 : sig end # module Int : sig type t = int val compare : 'a -> 'a -> int end module SInt : sig type elt = Int.t type t = Set.Make(Int).t val empty : t val is_empty : t -> bool val mem : elt -> t -> bool val add : elt -> t -> t val singleton : elt -> t val remove : elt -> t -> t val union : t -> t -> t val inter : t -> t -> t val diff : t -> t -> t val compare : t -> t -> int val equal : t -> t -> bool val subset : t -> t -> bool val iter : (elt -> unit) -> t -> unit val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a val for_all : (elt -> bool) -> t -> bool val exists : (elt -> bool) -> t -> bool val filter : (elt -> bool) -> t -> t val partition : (elt -> bool) -> t -> t * t val cardinal : t -> int val elements : t -> elt list val min_elt : t -> elt val max_elt : t -> elt val choose : t -> elt val split : elt -> t -> t * bool * t val find : elt -> t -> elt val of_list : elt list -> t end type (_, _) eq = Eq : ('a, 'a) eq type wrap = W of (SInt.t, SInt.t) eq module M : sig module I = Int type wrap' = wrap = W of (Set.Make(Int).t, Set.Make(I).t) eq end # module type S = sig module I = Int type wrap' = wrap = W of (Set.Make(Int).t, Set.Make(I).t) eq end # module Int2 : sig type t = int val compare : 'a -> 'a -> int end # Characters 49-69: include S with module I := I ^^^^^^^^^^^^^^^^^^^^ Error: In this `with' constraint, the new definition of I does not match its original definition in the constrained signature: Modules do not match: (module Int2) is not included in (module Int) # * * * * * * * * * * * module M : sig module N : sig module I = Int end module P : sig module I = N.I end module Q : sig type wrap' = wrap = W of (Set.Make(Int).t, Set.Make(P.I).t) eq end end # module type S = sig module N : sig module I = Int end module P : sig module I = N.I end module Q : sig type wrap' = wrap = W of (Set.Make(Int).t, Set.Make(P.I).t) eq end end # module M : sig module N : sig module I = Int end module P : sig module I = N.I end module Q : sig type wrap' = wrap = W of (Set.Make(Int).t, Set.Make(N.I).t) eq end end # module type S = sig module N : sig module I = Int end module P : sig module I : sig type t = int val compare : 'a -> 'a -> int end end module Q : sig type wrap' = wrap = W of (Set.Make(Int).t, Set.Make(N.I).t) eq end end # module type S = sig module M : sig type t val x : t end end # module H : sig type t = A val x : t end # module H' = H # module type S' = sig module M : sig type t = H.t = A val x : t end end # module type Alias = sig module N : sig end module M = N end # module F : functor (X : sig end) -> sig type t end # Characters -1--1: module type A = Alias with module N := F(List);; Error: Module type declarations do not match: module type A = sig module M = F(List) end does not match module type A = sig module M = F(List) end At position module type A = Modules do not match: sig module M = F(List) end is not included in sig module M = F(List) end At position module type A = sig module M : end Module F(List) cannot be aliased # Characters 17-18: module rec Bad : A = Bad;; ^ Error: Unbound module type A # module B : sig module R : sig type t = string end module O = R end module K : sig module E = B module N = E.O end # val x : K.N.t = "foo" # module M : sig type t = A module B : sig type u = B end end # module P : sig type t = M.t = A module B = M.B end # module P : sig type t = M.t = A module B = M.B end # module type S = sig module M : sig module P : sig end end module Q = M end # module type S = sig module M : sig module N : sig end module P : sig end end module Q : sig module N = M.N module P = M.P end end # module R : sig module M : sig module N : sig end module P : sig end end module Q = M end # module R' : S # module M : sig val f : 'a -> 'a end module rec R : sig module M : sig val f : 'a -> 'a end end # - : int = 3 # module rec R : sig module M = M end # - : int = 3 #