Hi Shayne, One approach is to name the *output* signature of the functors: module type EQ_PROD_S = sig module X : EQ module Y : EQ type t = X.t * Y.t val eq: t * t -> bool end module type EQ_PROD = functor (X : EQ) (Y : EQ) -> EQ_PROD_S with module X := X and module Y := Y module type ORD_PROD_S = sig include EQ_PROD_S val lt : t * t -> bool end module type LT_PROD = functor (X : EQ) (Y : EQ) -> LT_PROD_S with module X := X and module Y := Y etc. Cheers, Nicolas On Fri, Oct 28, 2016 at 2:44 PM, Shayne Fletcher < shayne.fletcher.50@gmail.com> wrote: > If one wants to include a functor signature in another... > > module type EQ = sig > type t > val eq : t * t -> bool > end > > module type EQ_PROD = functor (X : EQ) (Y : EQ) -> > sig > type t = X.t * Y.t > val eq : t * t -> bool > end > > module type ORD = sig > include EQ > val lt : t * t -> bool > end > > module type LT_PROD = functor (X : EQ) (Y : EQ) -> > sig > include EQ_PROD (*What do I say here?*) > end > > ​... How does one do that? Is there a syntax for this sort of thing?​ > > -- > Shayne Fletcher >