sig
  module type S =
    sig
      type t
      val append : Semigroup.S.t -> Semigroup.S.t -> Semigroup.S.t
    end
  module First :
    functor (T : sig type t end->
      sig type t = T.t val append : t -> t -> t end
  module Last :
    functor (T : sig type t end->
      sig type t = T.t val append : t -> t -> t end
end