From: ronniec95@lineone.net
To: caml-list@inria.fr
Subject: [Caml-list] Module/functor question
Date: Sun, 14 Mar 2004 19:05:28 +0000 [thread overview]
Message-ID: <20040314190527.GA1898@cradle> (raw)
Hello
I'm trying to acheive the following effect in Ocaml that I should be
able to do but am getting very confused with modules and functors...
I have a set of classes all with the structure:-
class Foo {
Foo* create(std::string x);
std::string toXml(Foo*);
... /* Other methods */
int m_x;
std::string m_y;
}
and I have a template function
template<typename T>
void serialisetoxml(T* x) { printf("%s\n",x->toXml().c_str());}
int main()
{
Foo* f = new Foo(1,"hello");
serialisetoxml(f);
}
The effect I want to acheive is to have a function that takes any module
that has a toXml function defined and invokes it somewhere.
The closest I got was
(*serialise.mli*)
type t (* this doesn't work...*)
module type Serialise
sig
val create : Xml.xml -> t (*Using XML-Light here *)
val to_xml : t -> Xml.xml
end
(*foo.mli*)
type t = { x : int ; y:int }
module Make
sig
val create : Xml.xml -> t (*Using XML-Light here *)
val to_xml : t -> Xml.xml
end
(*foo.ml*)
type t = { x : int ; y:int }
module Make : Serialiser =
struct
let create (f: Xml.xml) = Xml.Element("Foo",[("x",string_of_int f.x);("y",f.y))])
let to_xml (foo : t) = ...
(* It thinks f is of type Serialiser.t and not Foo.t *)
end
(* main.ml *)
module Sender (C : Serialiser) =
struct
let serialisetoxml msg = print_string (Xml.to_string (C.as_xml msg))
end
(* was hoping for something like this *)
let _ = let m = module Sender(Foo.Make) in
m.serialisetoxml (Foo.Make (Xml.parse_from "..."));
but I cannot figure out how to declare Foo having a signature of
Serialiser and then use it in main somehow. Assume also that I have
lots of other modules which have same basic interface but additional
methods specific to the modules.
Any help appreciated.
Thanks,
Ronnie
--
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
next reply other threads:[~2004-03-14 18:52 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-03-14 19:05 ronniec95 [this message]
2004-03-14 19:22 ` Yamagata Yoriyuki
2004-03-14 23:46 ` ronniec95
2004-03-15 12:34 ` Andreas Rossberg
2004-03-15 16:20 ` ronniec95
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=20040314190527.GA1898@cradle \
--to=ronniec95@lineone.net \
--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