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