Browse thread
Cannot safely evaluate the definition of the recursively-defined module
[
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: | Hugo Ferreira <hmf@i...> |
| Subject: | Re: [Caml-list] Cannot safely evaluate the definition of the recursively-defined module |
Michael Furr wrote: > > On Wed, 18 Mar 2009, Hugo Ferreira wrote: > >> I hope this is not a beginners questions. >> I am trying to reuse code via functors, >> however I am getting the following error: >> >> Cannot safely evaluate the definition of the recursively-defined module >> (refers to "AA.empty" when implemented as a constant value) >> >> I circumvented the problem by not using a >> constant value but a function instead. As I >> understand it this may cause run-time errors. >> My question is: is their any way to make the >> following example work. > > If you only need to store a constant value in the module, then you can > get around the restriction by splitting the module into a > (recursively-)safe module, and an extension that adds the constants. > Here is a slightly modified version of your code showing the > transformation: > Ok, I understand this. Thanks, Hugo F. > ---- > module type AA_Safe = > sig > type q > type t = string > > val compare: t -> t -> int > val add: t -> q -> q > (* omit empty here, since it is not "safe" *) > end > > module rec A1 : AA_Safe with type q = ASet.t = > struct > type q = ASet.t > type t = string > let compare s1 s2 = Pervasives.compare s1 s2 > let add e s = ASet.add e s > end > and ASet : Set.S with type elt = A1.t = Set.Make(A1) > > (* now create the full module *) > module type AA = sig > include AA_Safe > val empty: q > end > > module A2 : AA = struct > include A1 > let empty = ASet.empty > end > > module type Wrap_A = > sig > type t > type q > > val init: q > val add: t -> q -> q > end > module Make_A (An_A : AA) : Wrap_A > = > struct > type t = An_A.t > type q = An_A.q > > (*let init = ASet.empty*) > let init = An_A.empty > let add t q = An_A.add t q > end > > module Wrap_A1 = Make_A( A2 ) > ---- > > Cheers, > -Mike > > _______________________________________________ > Caml-list mailing list. Subscription management: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs >