[Caml-list] symbol table containing symbol tables

30 views
Skip to first unread message

William W Smith

unread,
Jan 2, 2007, 9:01:07 PM1/2/07
to caml...@yquem.inria.fr
In pidgin OCaml I'd like to write something like

type complicated =
IVal of int
| StrVa, of string
| SymTableVal of symTable
and
symTable = Map(string -> complicated)

I tried many variations on using the Map module to implement a recursive data structure like this. I failed miserably. (The above wasn't the syntax I ever used, but it gets the idea across.)

However, when I create an object
class [ 'key, 'content ] table : ('key -> 'key -> int) ->
object
,,,
end

I can successfully declare
type complicated =
IVal of int
| StrVal of string
| SymTableVal of (string, complicated) table
that does what I want. Ithis isn't the whole declaration of complicated, but I believe once I get this declaration working, the more quirky variations work too.

Do I need one of the more advanced features of OCaml that I don't currently understand to use Map the way that I want without writing a whole table class? I don't even see how I can use Map from inside the table class to do what I want which would also be acceptable.

I don't want to have to break open the Map module to modify it and thus change the licensing of my final program.

Thanks

Bill

Jon Harrop

unread,
Jan 2, 2007, 9:30:19 PM1/2/07
to caml...@yquem.inria.fr
On Wednesday 03 January 2007 01:59, William W Smith wrote:
> Do I need one of the more advanced features of OCaml that I don't currently
> understand to use Map the way that I want without writing a whole table
> class? I don't even see how I can use Map from inside the table class to
> do what I want which would also be acceptable.

You need recursive modules, something like this:

# module rec StringMap : Map.S = Map.Make(String)
and Symbols : sig
type t =


| IVal of int
| StrVal of string

| SymTableVal of t StringMap.t
end = struct
type t =


| IVal of int
| StrVal of string

| SymTableVal of t StringMap.t
end;;
module rec StringMap : Map.S
and Symbols :
sig
type t = IVal of int | StrVal of string | SymTableVal of t StringMap.t
end

HTH.

--
Dr Jon D Harrop, Flying Frog Consultancy Ltd.
Objective CAML for Scientists
http://www.ffconsultancy.com/products/ocaml_for_scientists

_______________________________________________
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

Jonathan Roewen

unread,
Jan 2, 2007, 9:30:46 PM1/2/07
to William W Smith
I don't believe you can eliminate the type variable (for the values
associated with the keys) from Map's signature. I would personally
just use a Hashtbl instead.

type complicated = Val of int | StrVal of string | SymTableVal of symTable
and symTable = (string, complicated) Hashtbl.t

Jonathan

Jonathan Roewen

unread,
Jan 2, 2007, 9:34:41 PM1/2/07
to Jon Harrop
Ooh, that's clever. An actual use case for recursive modules that's
also simple :-)
Reply all
Reply to author
Forward
0 new messages