From: Michael Furr <furr@cs.umd.edu>
To: caml-list@yquem.inria.fr
Subject: Re: [Caml-list] Cannot safely evaluate the definition of the recursively-defined module
Date: Thu, 19 Mar 2009 00:01:57 -0400 (EDT) [thread overview]
Message-ID: <Pine.GSO.4.64.0903182355520.29910@loompa> (raw)
In-Reply-To: <49C0E44F.6040603@inescporto.pt>
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
next prev parent reply other threads:[~2009-03-19 4:02 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-18 12:08 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 [this message]
2009-03-19 8:09 ` Hugo Ferreira
2009-09-25 20:06 ` Guillaume Yziquel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.GSO.4.64.0903182355520.29910@loompa \
--to=furr@cs.umd.edu \
--cc=caml-list@yquem.inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox