Hacker News new | ask | show | jobs
by gabelevi 4080 days ago
I'm also a fan of namespacing variants, and I used it extensively on an OCaml representation of the SpiderMonkey AST. (Coincidentally, up until writing our own parser we were using pfff's JavaScript parser! Go pfff!). Anyway, here are some other useful things I found in OCaml along the way:

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...