Let’s say we have a module type M with the following signature:
module type M = sig type 'a t val x : 'a t end
and a module ListM:
module ListM : (M with type 'a t = 'a list) = struct type 'a t = 'a list let x : 'a t =  end
We could use
(module ListM : M) to create a first-class module; however, the
type 'a t of M would be unspecified.
With the constraint
(module ListM : M with type 'a t = 'a list), the code can’t be compiled according to First-class modules.
The package-type syntactic class appearing in the (module package-type) type expression and in the annotated forms represents a subset of module types. This subset consists of named module types with optional constraints of a limited form: only non-parametrized types can be specified.
I don’t understand why parametrized type constraints are not allowed here. Is this related to the decidability or soundness of typing?