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