2010-07-11 7 views
4

Comment puis-je définir un Set dans OCaml qui peut aussi contenir un élément de son type?Jeu récursif dans OCaml

Pour expliquer le problème que j'ai une déclaration de type pour un grand nombre de types de données comme

type value = 
    Nil 
| Int of int 
| Float of float 
| Complex of Complex.t 
| String of string 
| Regexp of regexp 
| Char of char 
| Bool of bool 
| Range of (int*int) list 
| Tuple of value array 
| Lambda of code 
| Set of ValueSet.t (* this isn't allowed in my case since module is declared later*) 

En outre, je déclare un module concret pour ValueSet plus tard dans le même fichier:

module ValueSet = Set.Make(struct type t = value let compare = Pervasives.compare end) 

Le problème est que ValueSet a value comme c'est le type Elt, mais value peut être un ValueSet donc je reçois des problèmes tout en essayant de le compiler. Toutes ces déclarations sont contenues dans un fichier nommé types.ml (qui a sa propre interface types.mli mais sans ValueSet module decl puisque je ne suis pas sûr que ce soit possible).

Ce problème peut-il être résolu d'une manière ou d'une autre?

Répondre

5

Vous pouvez utiliser des modules récursifs. Language manual utilise précisément le même exemple de type de jeu récursif pour illustrer cette fonction de langage.

+0

Il semble que mon compilateur OCaml (3.11.0) ne les supporte pas encore. Dans tous les cas, avoir ce type de déclaration récursive à l'intérieur de 'types.ml' va forcer à avoir des modules internes comme' Types.InnerTypes' et 'Types.ValueSet' qui peuvent convenir à ValueSet mais pas à l'autre .. – Jack

+0

I pense que je le gère lentement pour fonctionner d'une certaine manière .. J'accepterai probablement votre réponse dans peu de temps si je peux la faire fonctionner :) – Jack

+0

OCaml a eu des modules récursifs depuis 3.07. – Gilles