From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by yquem.inria.fr (Postfix) with ESMTP id 0CF20BB84 for ; Wed, 16 Jul 2008 03:59:15 +0200 (CEST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak4BAD3zfEhCbwQcmmdsb2JhbACSPQEBAQEBCAUIBxGdWA X-IronPort-AV: E=Sophos;i="4.30,369,1212357600"; d="scan'208";a="15145230" Received: from discorde.inria.fr ([192.93.2.38]) by mail3-smtp-sop.national.inria.fr with ESMTP; 16 Jul 2008 03:59:14 +0200 Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id m6G1xDIS013285 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Wed, 16 Jul 2008 03:59:14 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak4BAD3zfEhCbwQcmmdsb2JhbACSPQEBAQEBCAUIBxGdWA X-IronPort-AV: E=Sophos;i="4.30,369,1212357600"; d="scan'208";a="15145224" Received: from out4.smtp.messagingengine.com ([66.111.4.28]) by mail3-smtp-sop.national.inria.fr with ESMTP; 16 Jul 2008 03:58:45 +0200 Received: from compute2.internal (compute2.internal [10.202.2.42]) by out1.messagingengine.com (Postfix) with ESMTP id B56B91399FC; Tue, 15 Jul 2008 21:58:43 -0400 (EDT) Received: from heartbeat1.messagingengine.com ([10.202.2.160]) by compute2.internal (MEProxy); Tue, 15 Jul 2008 21:58:43 -0400 X-Sasl-enc: bczFFMCL28xH/LNeviJi64dPtJyKnW9rwqqksRGtjCz6 1216173523 Received: from [192.168.1.10] (ALyon-157-1-62-228.w81-251.abo.wanadoo.fr [81.251.29.228]) by mail.messagingengine.com (Postfix) with ESMTPSA id C33DB298; Tue, 15 Jul 2008 21:58:42 -0400 (EDT) Date: Wed, 16 Jul 2008 03:54:31 +0200 (CEST) From: Martin Jambon X-X-Sender: martin@martin.ec.wink.com To: Andre Nathan Cc: Ashish Agarwal , caml-list@inria.fr Subject: Re: [Caml-list] Another question about modules In-Reply-To: <1216169075.5294.32.camel@homesick> Message-ID: References: <1216154495.5294.9.camel@homesick> <1216162299.5294.22.camel@homesick> <1216169075.5294.32.camel@homesick> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Miltered: at discorde with ID 487D55F1.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; ens-lyon:01 ocamlc:01 mli:01 ocamlc:01 mli:01 ocamlopt:01 endline:01 ocaml:01 nodes:01 low-level:01 variants:01 val:01 val:01 beginner's:01 ocaml:01 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 >> 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/