Currently, for [sig ... end with type lhs := rhs] to be valid, rhs needs to be an application of a type constructor to the same type parameters as lhs.

I'd like to do, at a minimum, [sig ... end with type 'a t := 'a], but this is currently forbidden. Are there conceptual obstacles to permitting arbitrary type expressions on the RHS, or are they simply not implemented yet?

Note that I can do [type 'a id = 'a] and then [... with type 'a t := 'a id], but it's clumsy to have to define an auxiliary type for this and it's not always easy to find an appropriate place to do so.

In particular, I have modules with a blocking interface and an Async interface, so I define:

module type Thing = sig
  type 'a result
  val read_thing : in_channel -> thing result
  val write_thing : out_channel -> unit result
end

thing_async.mli:
include Thing with type 'a result := 'a Deferred.t
thing_or_error.mli:
include Thing with type 'a result := 'a Or_error.t
thing_exn.mli:
include Thing with type 'a result := 'a (* fails :( *)

Having Thing_exn.id be a useless type constructor would be pretty sad.