[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Hawkins, Thomas <thomas.d.hawkins@m...> |
| Subject: | [Caml-list] Undefined_recursive_module |
I just started experimenting with recursive modules, but have hit a snag with Undefined_recursive_module.
Basically I need to define an ADT where the data structure contains Sets and the Set elements reference back to the data structure. In the following example, the mutually recursive modules include the main data structure (Process), an ordered type (Files), and a set (FileSet returned from the Set functor).
Both the Process and the File modules define only function values, therefore I believe the example satisfies the "safe module" requirement. It does compile and run for one case (see does_work). However, if I make multiple calls to Process.add_file, Undefined_recursive_module is raised (see does_not_work).
Any suggestions? (I'm using 3.08.0)
Thanks,
Tom
module rec Process :
sig
type t
val create : unit -> t
val add_file : File.t -> t -> unit
val print : t -> unit
end
=
struct
type t = { mutable files : FileSet.t }
let create () =
{ files = FileSet.empty }
let add_file file process =
process.files <- FileSet.add file process.files
let print process =
FileSet.iter File.print process.files
end
and File :
sig
type t
val compare : t -> t -> int
val create : Process.t -> string -> t
val print : t -> unit
end
=
struct
type t = Process.t * string
let compare a b =
match a, b with (_, a), (_, b) -> String.compare a b
let create process name =
process, name
let print (_, name) =
print_string name;
print_newline ()
end
and FileSet :
Set.S with type elt = File.t
=
Set.Make(File)
;;
let does_work () =
let p = Process.create () in
Process.add_file (File.create p "file1") p;
Process.print p
;;
let does_not_work () =
let p = Process.create () in
Process.add_file (File.create p "file1") p;
Process.add_file (File.create p "file2") p;
Process.print p
;;
(*
does_work ();;
*)
does_not_work ();;
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners