module Container:sig..end
Container.Make is to bind the resulting module and to explicitly
    import each of the functions that one wants:
      module C = Container.Make (struct ... end)
      let count    = C.count
      let exists   = C.exists
      let find     = C.find
      ...
    
This is preferable to:
      include Container.Make (struct ... end)
    
    because the include makes it to easy to shadow specialized implementations of
    container functions (length being a common one).
    Container.Make implements iter in terms of fold, which is often slower than
    implementing iter directly.
module type T =sig..end
val fold_count : ('a -> init:int -> f:(int -> 'b -> int) -> 'c) -> 'a -> f:('b -> bool) -> 'cmodule Make:
Container.Make is to bind the resulting module and to explicitly
    import each of the functions that one wants:
module type S0 =sig..end
module type S0_phantom =sig..end
module type S1 =sig..end
module type S1_phantom =sig..end
module type S1_phantom_invariant =sig..end
module type Generic =sig..end
module type Generic_phantom =sig..end
module Check:
module Check_S0:
module Check_S0_phantom:
module Check_S1:
type phantom 
module Check_S1_phantom:functor (M:S1_phantom) ->Check(sigtype'at =('a, Container.phantom) M.tend)(sigtype'at ='aend)(M)
module Check_S1_phantom_invariant:functor (M:S1_phantom_invariant) ->Check(sigtype'at =('a, Container.phantom) M.tend)(sigtype'at ='aend)(M)
Container.Make is to bind the resulting module and to explicitly
    import each of the functions that one wants:
      module C = Container.Make (struct ... end)
      let count    = C.count
      let exists   = C.exists
      let find     = C.find
      ...
    
This is preferable to:
      include Container.Make (struct ... end)
    
    because the include makes it to easy to shadow specialized implementations of
    container functions (length being a common one).
    Container.Make implements iter in terms of fold, which is often slower than
    implementing iter directly.