This was just a federal court, not the Supreme Court.
type statement = ExpressionStatement of expression
and expression = FunctionExpression of statement list
to do this with modules you need to use recursive modules, like module rec Statement : sig
type t = Expression of Expression.t
end = struct
type t = Expression of Expression.t
end
and Expression : sig
type t = Function of Statement.t list
end = struct
type t = Function of Statement.t list
end
One of the sucky things about recursive modules is that you cannot omit the signatures, however if your modules only include types then there is a shortcut that looks like module rec Statement : sig
type t = Expression of Expression.t
end = Statement
and Expression : sig
type t = Function of Statement.t list
end = Expression
Links:
Big real world example:
https://github.com/facebook/flow/blob/3a5b4040b7d2a648f97a06...