2010/9/3 Sylvain Le Gall
<sylvain@le-gall.net>
I would like to define:
type license = GPL | LGPL
and
let data = [ GPL, "GNU Public license";
LGPL, "GNU Lesser General Public license" ]
I would like to enforce that all variants of license are in the
association list.
As said by other guys, you can't enforce statically such an invariant without a code generator.
In pure ocaml, the below solution use a "social check" : it works only if the developer who adds a new constructor is not too bad and takes care of context when solving an error ;-).
type license = GPL | LGPL
let data =
[ GPL, "GNU Public license";
LGPL, "GNU Lesser General Public license" ]
let () = match GPL with
| GPL | LGPL ->
assert
(let s = "Do not forget to add new constructors to the data
list above." in
Format.ifprintf Format.std_formatter "%s" s;
true)
Hope this helps,
Julien