Redundancy in OCaml type declaration (ml/mli)

Viewed 9388

I'm trying to understand a specific thing about ocaml modules and their compilation:

am I forced to redeclare types already declared in a .mli inside the specific .ml implementations?

Just to give an example:

(* foo.mli *)
type foobar = Bool of bool | Float of float | Int of int

(* foo.ml *)
type baz = foobar option

This, according to my normal way of thinking about interfaces/implementations, should be ok but it says

Error: Unbound type constructor foobar

while trying to compile with

ocamlc -c foo.mli
ocamlc -c foo.ml

Of course the error disappears if I declare foobar inside foo.ml too but it seems a complex way since I have to keep things synched on every change.

Is there a way to avoid this redundancy or I'm forced to redeclare types every time?

Thanks in advance

5 Answers
Related