* Cannot safely evaluate the definition of the recursively-defined module @ 2009-03-18 12:08 Hugo Ferreira 2009-03-18 12:48 ` [Caml-list] " Alp Mestan 2009-03-19 4:01 ` Michael Furr 0 siblings, 2 replies; 8+ messages in thread From: Hugo Ferreira @ 2009-03-18 12:08 UTC (permalink / raw) To: caml-list Hello, 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. Specifically, for the example below is their any way of indicating to the compiler that AA.q = ASet.t ? TIA, Hugo F. module type AA = sig type q type t = string val compare: t -> t -> int val add: t -> q -> q val empty: unit -> q end module rec A1 : AA = struct type q = ASet.t type t = string let compare s1 s2 = Pervasives.compare s1 s2 let add e s = ASet.add e s let empty _ = ASet.empty end and ASet : Set.S with type elt = A1.t = Set.Make(A1) 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( A1 ) ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Cannot safely evaluate the definition of the recursively-defined module 2009-03-18 12:08 Cannot safely evaluate the definition of the recursively-defined module Hugo Ferreira @ 2009-03-18 12:48 ` Alp Mestan 2009-03-18 15:56 ` Hugo Ferreira 2009-03-19 4:01 ` Michael Furr 1 sibling, 1 reply; 8+ messages in thread From: Alp Mestan @ 2009-03-18 12:48 UTC (permalink / raw) To: caml-list [-- Attachment #1: Type: text/plain, Size: 2195 bytes --] Hi, replacing : module rec A1 : AA = struct type q = ASet.t type t = string with : module rec A1 : AA with type q = ASet.t, type t = string should be okay. Shouldn't it ? On Wed, Mar 18, 2009 at 1:08 PM, Hugo Ferreira <hmf@inescporto.pt> wrote: > Hello, > > 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. > > Specifically, for the example below is their > any way of indicating to the compiler that > AA.q = ASet.t ? > > TIA, > Hugo F. > > module type AA = > sig > type q > type t = string > > val compare: t -> t -> int > val add: t -> q -> q > val empty: unit -> q > end > > module rec A1 : AA > = struct > type q = ASet.t > type t = string > > let compare s1 s2 = Pervasives.compare s1 s2 > let add e s = ASet.add e s > let empty _ = ASet.empty > end > and ASet : Set.S with type elt = A1.t > = Set.Make(A1) > > 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( A1 ) > > _______________________________________________ > 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 > -- Alp Mestan In charge of the C++ section on Developpez.com. [-- Attachment #2: Type: text/html, Size: 3094 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Cannot safely evaluate the definition of the recursively-defined module 2009-03-18 12:48 ` [Caml-list] " Alp Mestan @ 2009-03-18 15:56 ` Hugo Ferreira 2009-03-18 16:49 ` Julien SIGNOLES 0 siblings, 1 reply; 8+ messages in thread From: Hugo Ferreira @ 2009-03-18 15:56 UTC (permalink / raw) To: Alp Mestan; +Cc: caml-list Alp Mestan wrote: > Hi, > > replacing : > module rec A1 : AA > = struct > type q = ASet.t > type t = string > > with : > module rec A1 : AA with type q = ASet.t, type t = string > > should be okay. Shouldn't it ? > You mean? module rec A1 : AA with type q = ASet.t with type t = string = struct type q = ASet.t type t = string let compare s1 s2 = Pervasives.compare s1 s2 let add e s = ASet.add e s let empty = ASet.empty end and ASet : Set.S with type elt = A1.t = Set.Make(A1) No. It doens't work. R, Hugo F. > On Wed, Mar 18, 2009 at 1:08 PM, Hugo Ferreira <hmf@inescporto.pt > <mailto:hmf@inescporto.pt>> wrote: > > Hello, > > 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. > > Specifically, for the example below is their > any way of indicating to the compiler that > AA.q = ASet.t ? > > TIA, > Hugo F. > > module type AA = > sig > type q > type t = string > > val compare: t -> t -> int > val add: t -> q -> q > val empty: unit -> q > end > > module rec A1 : AA > = struct > type q = ASet.t > type t = string > > let compare s1 s2 = Pervasives.compare s1 s2 > let add e s = ASet.add e s > let empty _ = ASet.empty > end > and ASet : Set.S with type elt = A1.t > = Set.Make(A1) > > 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( A1 ) > > _______________________________________________ > 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 > > > > > -- > Alp Mestan > In charge of the C++ section on Developpez.com. > > > ------------------------------------------------------------------------ > > _______________________________________________ > 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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Cannot safely evaluate the definition of the recursively-defined module 2009-03-18 15:56 ` Hugo Ferreira @ 2009-03-18 16:49 ` Julien SIGNOLES 2009-03-18 17:01 ` Hugo Ferreira 0 siblings, 1 reply; 8+ messages in thread From: Julien SIGNOLES @ 2009-03-18 16:49 UTC (permalink / raw) To: Hugo Ferreira; +Cc: Alp Mestan, caml-list Hello, > module rec A1 : AA with type q = ASet.t > with type t = string > = struct > type q = ASet.t > type t = string > > let compare s1 s2 = Pervasives.compare s1 s2 > let add e s = ASet.add e s > let empty = ASet.empty > end > and ASet : Set.S with type elt = A1.t > = Set.Make(A1) > > No. It doens't work. > > 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) That is consistent with the behaviour specified in Section 7.8 of the reference manual [1]. Both A1 and ASet are not safe according to the definition given in this section. So a type error occurs because ocaml does know that the program won't be safely evaluated. For additional details, you could refer to the Xavier Leroy's notes describing the implementation of recursive modules in ocaml [2]. [1] http://caml.inria.fr/pub/docs/manual-ocaml/manual021.html#toc75 [2] http://caml.inria.fr/pub/papers/xleroy-recursive_modules-03.pdf Hope this helps, Julien Signoles -- Researcher-engineer CEA LIST, Software Reliability Lab 91191 Gif-Sur-Yvette Cedex tel:(+33)1.69.08.71.83 fax:(+33)1.69.08.83.95 Julien.Signoles@cea.fr ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Cannot safely evaluate the definition of the recursively-defined module 2009-03-18 16:49 ` Julien SIGNOLES @ 2009-03-18 17:01 ` Hugo Ferreira 0 siblings, 0 replies; 8+ messages in thread From: Hugo Ferreira @ 2009-03-18 17:01 UTC (permalink / raw) To: Julien SIGNOLES; +Cc: caml-list Julien SIGNOLES wrote: > Hello, > >> module rec A1 : AA with type q = ASet.t >> with type t = string >> = struct >> type q = ASet.t >> type t = string >> >> let compare s1 s2 = Pervasives.compare s1 s2 >> let add e s = ASet.add e s >> let empty = ASet.empty >> end >> and ASet : Set.S with type elt = A1.t >> = Set.Make(A1) >> >> No. It doens't work. > >>> 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) > > That is consistent with the behaviour specified in Section 7.8 of the > reference manual [1]. Both A1 and ASet are not safe according to the > definition given in this section. So a type error occurs because ocaml > does know that the program won't be safely evaluated. > > For additional details, you could refer to the Xavier Leroy's notes > describing the implementation of recursive modules in ocaml [2]. > > [1] http://caml.inria.fr/pub/docs/manual-ocaml/manual021.html#toc75 > [2] http://caml.inria.fr/pub/papers/xleroy-recursive_modules-03.pdf > Read the manual. I'll take a look at [2] Thank you. Hugo F. > Hope this helps, > Julien Signoles ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Cannot safely evaluate the definition of the recursively-defined module 2009-03-18 12:08 Cannot safely evaluate the definition of the recursively-defined module Hugo Ferreira 2009-03-18 12:48 ` [Caml-list] " Alp Mestan @ 2009-03-19 4:01 ` Michael Furr 2009-03-19 8:09 ` Hugo Ferreira 1 sibling, 1 reply; 8+ messages in thread From: Michael Furr @ 2009-03-19 4:01 UTC (permalink / raw) To: caml-list 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: ---- 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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Cannot safely evaluate the definition of the recursively-defined module 2009-03-19 4:01 ` Michael Furr @ 2009-03-19 8:09 ` Hugo Ferreira 2009-09-25 20:06 ` Guillaume Yziquel 0 siblings, 1 reply; 8+ messages in thread From: Hugo Ferreira @ 2009-03-19 8:09 UTC (permalink / raw) To: caml-list 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 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Cannot safely evaluate the definition of the recursively-defined module 2009-03-19 8:09 ` Hugo Ferreira @ 2009-09-25 20:06 ` Guillaume Yziquel 0 siblings, 0 replies; 8+ messages in thread From: Guillaume Yziquel @ 2009-09-25 20:06 UTC (permalink / raw) To: Hugo Ferreira; +Cc: caml-list Hello. Sorry for reviving this short thread. I have the same error message, but I really do not understand what "safety" means in this context. If I specify the signature of the recursive module, shouldn't the type checker work out right out of the box? Sorry, but I'm a bit confused. You'll find the recursive submodule that I'm having problems with below Hugo's email. All the best, Guillaume Yziquel. Hugo Ferreira a écrit : > 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 Here's my recursive submodule: > module rec Registry : sig > > val new_status_signal : t -> status React.signal > val registry : (t * status React.signal) list React.signal > val status_of_agent : t -> status > > end = struct > > let new_status_signal agent = React.S.fold > begin function current_status -> function > | AgentPresent (agent_of_signal, status_information) -> > begin match agent = agent_of_signal with > | false -> current_status > | true -> status_information > end > | AsteriskStatus (Asterisk.Active activity) -> > let agent_ip = match Registry.status_of_agent agent with > | Present ip -> Some ip > | Online (ip, _) -> Some ip > | _ -> None in > begin match agent_ip with None -> current_status > | Some ip -> current_status (* To do... *) > end > | AsteriskStatus _ -> current_status > end Offline (React.E.select [ > agent_status_notification; > (React.E.map begin function s -> AsteriskStatus s end > (Asterisk.server # status_change)) > ]) > > let registry = React.S.fold > begin fun live_registry new_agent -> new_agent::live_registry end > begin Lwt_main.run (persistent_registry >>= Ocsipersist.get >>= > begin function a_list -> Lwt.return (List.map > begin function (nom, prenom) -> > let a = {nom = nom; prenom = prenom} in > a, (Registry.new_status_signal a) > end a_list) > end) > end > begin React.E.map > begin function agent -> agent, (Registry.new_status_signal agent) end > adding_to_registry > end > > let status_of_agent agent = > try React.S.value (List.assoc agent (React.S.value Registry.registry)) > with Not_found -> raise (invalid_arg ("Agent.status_of_agent: "^agent.prenom^" "^agent.nom)) > > end -- Guillaume Yziquel http://yziquel.homelinux.org/ ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-09-25 20:11 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2009-03-18 12:08 Cannot safely evaluate the definition of the recursively-defined module Hugo Ferreira 2009-03-18 12:48 ` [Caml-list] " Alp Mestan 2009-03-18 15:56 ` Hugo Ferreira 2009-03-18 16:49 ` Julien SIGNOLES 2009-03-18 17:01 ` Hugo Ferreira 2009-03-19 4:01 ` Michael Furr 2009-03-19 8:09 ` Hugo Ferreira 2009-09-25 20:06 ` Guillaume Yziquel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox