Hi Shayne, I did not try it, but I think you want module Mul_default : MUL = functor (E : EQ) (N : NUM with type t = E.t) -> struct include E include (N : NUM with type t := E.t) let mul (x : t) (y : t) : t = failwith "foo" end Cheers, Nicolas On Fri, Oct 28, 2016 at 6:12 PM, Shayne Fletcher < shayne.fletcher.50@gmail.com> wrote: > > On Fri, Oct 28, 2016 at 9:28 AM, Shayne Fletcher < > shayne.fletcher.50@gmail.com> wrote: > >> On Fri, Oct 28, 2016 at 9:25 AM, Nicolas Ojeda Bar < >> nicolas.ojeda.bar@lexifi.com> wrote: >> >>> You can add a constrain to your functor arguments : >>> >>> module type MUL = functor (E : EQ) (N : NUM with type t = E.t) -> >>> MUL_S with module N := N and module E := E >>> >> >> ​That does it! I tried so many different things :) You're a rock 'n roll >> star. >> > > ​Still stuck on how to achieve this I'm afraid. > > module type EQ = sig > type t > val eq : t * t -> bool > end > > module type NUM = sig > type t > val from_int : int -> t > val ( + ) : t -> t -> t > end > > module type MUL_S = sig > include EQ > include NUM with type t := t > > val mul : t -> t -> t > end > > module type MUL = functor (E : EQ) (N : NUM with type t = E.t) -> MUL_S > > module Mul_default (E : EQ) (N : NUM with type t = E.t) : MUL = struct > > include E > include (N : NUM with type t := E.t) > > let mul (x : t) (y : t) : t = failwith "foo" > > end > > Yields. > > ​Error: Signature mismatch: > Modules do not match: > sig > type t = E.t > val eq : t * t -> bool > val from_int : int -> E.t > val ( + ) : E.t -> E.t -> E.t > val mul : t -> t -> t > end > is not included in > MUL​ > > -- > Shayne Fletcher >