From: Martin Jambon <martin.jambon@ens-lyon.org>
To: Andre Nathan <andre@digirati.com.br>
Cc: Ashish Agarwal <agarwal1975@gmail.com>, caml-list@inria.fr
Subject: Re: [Caml-list] Another question about modules
Date: Wed, 16 Jul 2008 03:54:31 +0200 (CEST) [thread overview]
Message-ID: <Pine.LNX.4.64.0807160259590.10885@martin.ec.wink.com> (raw)
In-Reply-To: <1216169075.5294.32.camel@homesick>
On Tue, 15 Jul 2008, Andre Nathan wrote:
> Hi
>
> I've run this:
>
> ocamlc -c a.mli
> ocamlc -c b.mli
> ocamlopt -c a.ml
>
> The third command gives the error. I thought that the circular
> dependency problem was related only to mutually-dependent types on
> separate modules, but I guess I was wrong.
>
> Searching the archives, it seems that the solution is to eliminate the
> references to B in A by passing a function argument to A.f, as in
>
> type t = { id: int }
> let f bfun x = print_int x.id; bfun x
>
> and then in b.ml something like
>
> let f x = print_endline (string_of_int 42)
> let _ = let a = { A.id = 1 } in A.f f a
>
> That appears to solve the issue, although in my actual code it means
> adding an extra parameter to many functions, since the call to what was
> B.f here is somewhat deep in the call stack, so maybe there is a better
> solution.
If you have no other choice, you can do something like that:
--- a.ml ---
let b_fun_ref = ref (fun _ -> assert false)
let b_fun x = !b_fun_ref x
let a_fun x =
...
b_fun
...
--- b.ml ---
let b_fun x =
...
A.a_fun
...
let () =
A.b_fun_ref := b_fun
For complex projects, the object system happens to be an excellent way of
avoiding interdependency problems:
* You define class types early. Not a requirement, but highly recommended.
* You develop independent modules that would work with objects of these
class types, without worrying about inter-dependencies.
* You just pass objects around, since they carry all the functions needed.
* You can have different implementations of the same class type.
* You can use inheritance.
In my opinion, using OCaml objects makes sense only in large
projects. It's not theoretically or algorithmically exciting, but makes
things manageable without magic skills.
I would say that objects are not well-suited to represent nodes
of low-level data structures, because of performance but
also because you may want to use pattern matching, circularity and other
things that tuples, records and variants do better.
I hope you'll find this useful
:-)
Martin
> Thanks,
> Andre
>
> On Tue, 2008-07-15 at 20:18 -0400, Ashish Agarwal wrote:
>> Firstly, you have a circular dependency. How are you compiling? That
>> should be the first error you get.
>>
>>
>> On Tue, Jul 15, 2008 at 6:51 PM, Andre Nathan <andre@digirati.com.br>
>> wrote:
>> I think this is similar to this simpler problem:
>>
>> a.ml:
>>
>> type t = { id: int }
>> let f x = print_int x.id; B.f x
>>
>> a.mli:
>>
>> type t
>> val f : t -> unit
>>
>>
>> b.ml:
>>
>> let f x = print_int 42
>>
>> b.mli:
>>
>> val f : A.t -> unit
>>
>>
>> Which results in "This expression has type t but is here used
>> with type
>> A.t" in a.ml, even though t and A.t are the same type. Is
>> there a
>> general solution for this kind of situation?
>>
>> Thanks,
>>
>> Andre
>>
>> _______________________________________________
>> 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
>>
>>
>>
>
> _______________________________________________
> 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
>
--
http://wink.com/profile/mjambon
http://mjambon.com/
next prev parent reply other threads:[~2008-07-16 1:59 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-15 20:41 Andre Nathan
2008-07-15 22:51 ` [Caml-list] " Andre Nathan
2008-07-16 0:18 ` Ashish Agarwal
2008-07-16 0:44 ` Andre Nathan
2008-07-16 1:05 ` Ashish Agarwal
2008-07-16 14:05 ` Daniel Bünzli
2008-07-16 1:54 ` Martin Jambon [this message]
2008-07-16 14:15 ` Andre Nathan
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.LNX.4.64.0807160259590.10885@martin.ec.wink.com \
--to=martin.jambon@ens-lyon.org \
--cc=agarwal1975@gmail.com \
--cc=andre@digirati.com.br \
--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