functor (M : S-> sig type t = M.t val append : t -> t -> t val zero : t end