From: "Christopher Dutchyn" <cdutchyn@cs.ubc.ca>
To: "CAML List" <caml-list@inria.fr>
Subject: [Caml-list] Recursive Modules
Date: Fri, 29 Aug 2003 13:17:17 -0700 [thread overview]
Message-ID: <009e01c36e6a$8b2d81f0$170b678e@cs.ubc.ca> (raw)
[-- Attachment #1: Type: text/plain, Size: 3226 bytes --]
I think the recursive modules definitions do not completely propagate safe
definitions: I get
Exception: Undefined_recursive_module ("SimpleLayer.ml", 104, 23)
with the attached code.
Chris D.
module type LAYER =
sig
type topT
type topV
val topInj : string -> topT
val topOp : topT -> topV
val topExt : topV -> string
type t
type v
val inj : string -> t
val op : t -> v
val ext : v -> string
end
(* base module -- no lower layer present, empty types, all operations are
errors *)
(* *** ``safe'' module (section 7.8 of refman) *** *)
module MakeBase =
functor (Above : LAYER) ->
struct
type topT = Above.topT
type topV = Above.topV
let topInj = fun x -> Above.topInj x(*safe*)
let topOp = fun x -> Above.topOp x (*safe*)
let topExt = fun x -> Above.topExt x(*safe*)
type t = EmptyT (* wouldn't revised syntax be nice *)
type v = EmptyV
let inj = fun _ -> raise (Failure "inj")
let op = fun _ -> raise (Failure "op")
let ext = fun _ -> raise (Failure "ext")
end
(* an intermediate level *)
module MakeMiddle =
functor (Below : LAYER) ->
functor (Above : LAYER) ->
struct
type topT = Above.topT
type topV = Above.topV
let topInj = Above.topInj
let topOp = Above.topOp
let topExt = Above.topExt
type t =
| BelowT of Below.t
| OneT of char
| TwoT of char * topT
type v =
| BelowV of Below.v
| StringV of string
let inj = fun s -> (* <T> ::= 1_ [OneT _] | 2_? [TwoT _ ?] |
<Below.T> *)
match (String.get s 0) with
| '1' -> OneT (String.get s 1)
| '2' -> TwoT(String.get s 1, topInj (String.sub s 2 ((String.length
s)-2)))
| _ -> BelowT (Below.inj s)
let op =
function
| BelowT t -> BelowV (Below.op t)
| OneT(c) -> StringV ("1" ^ (String.make 1 c))
| TwoT(c,t) -> StringV ("2" ^ (String.make 1 c) ^ (topExt (topOp
t)))
let ext =
function
| BelowV v -> Below.ext v
| StringV s -> s
end
(* imagine there were more levels -- maybe even tree/graph structured *)
(* top level -- close the open recursion of topInj and topExt *)
(* *** ``safe'' module (section 7.8 of refman) *** *)
module MakeTop =
functor (Below : LAYER) ->
struct
type t = Below.t
type v = Below.v
let inj = fun x -> Below.inj x (*safe*)
let op = fun x -> Below.op x (*safe*)
let ext = fun x -> Below.ext x (*safe*)
type topT = t
type topV = v
let topInj = fun x -> inj x (*safe*)
let topOp = fun x -> op x (*safe*)
let topExt = fun x -> ext x (*safe*)
end
(* simplest test *)
module rec B : LAYER = MakeBase(T)
and T : LAYER = MakeTop(B)
(* simple test *)
module rec B : LAYER = MakeBase(M)
and M : LAYER = MakeMiddle(B)(T)
(* imagine there were more levels *)
and T : LAYER = MakeTop(M);;
T.topOp (T.topInj "2x1x");;
T.topExt (T.topOp (T.topInj "2x1x"))
[-- Attachment #2: Type: text/html, Size: 18585 bytes --]
next reply other threads:[~2003-08-29 20:17 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-08-29 20:17 Christopher Dutchyn [this message]
-- strict thread matches above, loose matches on Subject: below --
2003-05-05 8:21 [Caml-list] recursive modules Xavier Leroy
2003-05-05 11:29 ` Markus Mottl
2003-05-16 16:31 ` brogoff
2003-05-05 12:20 ` John Max Skaller
2003-05-05 16:59 ` brogoff
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='009e01c36e6a$8b2d81f0$170b678e@cs.ubc.ca' \
--to=cdutchyn@cs.ubc.ca \
--cc=caml-list@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