functor (T : sig type t end->
  sig
    type t = T.t list
    type data = T.t
    val init : t
    val f : t -> data -> t
  end