Puis-je avoir deux unités de compilateurs / modules /
signatures / foncteurs mutuellement récursifs ?
Actuellement pas dans la partie stable dans le langage. Il
existe par contre une extension
d'OCaml (qui peut donc être supprimée ou modifiée
à tout instant) qui résoud certains de ces problèmes.
Comment puis-je exprimer des contraintes de partage entre
modules ?
Utilisez des spécifications de types explicites dans les
arguments des foncteurs. Par exemple, si les deux signatures
suivantes sont définies,
module type S1 = sig ... type t ... end module type S2 = sig ... type u ... endPour définir un foncteur
F
qui prend en arguments
deux paramètres X:S1
et Y:S2
tels
X.t
et Y.u
sont identiques, écrivez:
module F (X: S1) (Y: S2 with type u = X.t) = struct ... endEn interne, ceci est en effet expansé en
module F (X: S1) (Y: sig ... type u = X.t ... end) = struct ... end
Les unités de compilation sont forcément des modules. Comment
puis-je avoir une unité qui soit plutôt un foncteur ou
une signature ?
En OCaml les foncteurs et les signatures (types
de modules) peuvent être des composants de modules. Il
suffit donc de transformer le foncteur ou la signature en
un élément d'une unité de compilation. Un bon exemple de
cette approche est le module
Set
de la librairie
standard.