Really ? That sounds horrible.
What’s wrong with defining
module type Myexpectation = sig
include Ordered
include Printable with type t := t
end
And then using:
let foo (module A : Myexpectation) (x : A.t) = ...
I don’t think it’s that bad in practice. E.g. see here and usage here for examples.