Namespacing Variants in ML
keleshev.com
keleshev.com
Without namespacing, you might be using mutually recursive type definitions like
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...Recursive module docs: http://caml.inria.fr/pub/docs/manual-ocaml-400/manual021.htm...
type color = `Red | `Green | `Blue | `Black | `Brown
type hair_color = `Black | `Brown | `Blond