functor (M1 : S) (M2 : S->
  sig type t = M1.t * M2.t val append : t -> t -> t val zero : t end