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=1.1 required=5.0 tests=AWL,SPF_NEUTRAL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by yquem.inria.fr (Postfix) with ESMTP id 1168DBC69 for ; Fri, 19 Oct 2007 10:21:19 +0200 (CEST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAAAI4FGEfAXQImh2dsb2JhbACOTwIBCAop X-IronPort-AV: E=Sophos;i="4.21,299,1188770400"; d="scan'208";a="3347394" Received: from discorde.inria.fr ([192.93.2.38]) by mail2-smtp-roc.national.inria.fr with ESMTP; 19 Oct 2007 10:21:19 +0200 Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id l9J8LE5F024489 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Fri, 19 Oct 2007 10:21:18 +0200 X-IronPort-AV: E=Sophos;i="4.21,299,1188770400"; d="scan'208";a="18337654" Received: from peray.inria.fr (HELO ausone.inria.fr) ([128.93.8.98]) by mail4-relais-sop.national.inria.fr with SMTP; 19 Oct 2007 10:21:17 +0200 Received: by ausone.inria.fr (sSMTP sendmail emulation); Fri, _d Oct 2007 10:20:43 +0200 From: "Nicolas Pouillard" Cc: caml-list Subject: Re: [Caml-list] How do apply functors with module constraints? To: Alan Falloon References: In-Reply-To: Date: Fri, 19 Oct 2007 10:20:42 +0200 Message-Id: <1192781795-sup-8511@ausone.inria.fr> User-Agent: Sup/0.1 Content-Type: text/plain; charset=UTF-8 X-j-chkmail-Score: MSGID : 471868FA.000 on discorde : j-chkmail score : X : 0/20 1 0.000 -> 1 X-Miltered: at discorde with ID 471868FA.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; functors:01 functor:01 sig:01 val:01 val:01 sig:01 struct:01 iter:01 struct:01 endline:01 abstraction:01 syntax:01 syntax:01 daisy:98 daisy:98 Excerpts from Alan Falloon's message of Fri Oct 19 01:19:05 +0200 2007: > I am having a really hard time figuring out how to instantiate a functor > when its arguments have module constraints. Here is an example: You can also expose that Bob is an apple pie baker, and Daisy an apple pie eater: module Bob : BAKER with module Pie = Apple = ... module Daisy : PIG with module Pie = Apple = ... HTH, > module type PIE = sig > type pie > val bake : unit -> pie > val eat : pie -> unit > end > > module type BAKER = sig > module Pie : PIE > val dozen : unit -> Pie.pie array > end > > module type PIG = sig > module Pie : PIE > val feed : Pie.pie -> unit > end > > (* Need a module constraint to make sure that the baker and pig are > talking about the same pie *) > module Farmer (Baker : BAKER) (Pig : PIG with module Pie = Baker.Pie) = > struct > let feed_pigs () = > let pies = Baker.dozen () in > Array.iter Pig.feed pies > end > > module Apple : PIE = struct > type pie = Pie of string > let bake () = Pie "apple" > let eat (Pie "apple") = () > end > > module Bob : BAKER = struct > module Pie = Apple > let dozen () = Array.init 13 (fun _ -> Pie.bake ()) > end > > module Daisy : PIG = struct > module Pie = Apple > let feed p = Pie.eat p; print_endline "OINK!" > end > > module Joe = Farmer(Bob)(Daisy) (*BOOM*) > let () = Joe.feed_pigs() > > > However, this fails to compile because when I try to make module Joe > because Bob.Pie and Daisy.Pie aren't the same. Fair enough, thats what > abstraction is for, however I can't figure out the syntax to instantiate > Joe! I tried this: > > module Joe = Farmer(Bob)(Daisy:PIG with module Pie=Bob.Pie) > > But then I get a syntax error (?) > File "bar.ml", line 39, characters 30-31: > Syntax error: ')' expected > File "bar.ml", line 39, characters 24-25: > This '(' might be unmatched > > Now I'm fresh out of ideas. > > Thanks > Alan Falloon > -- Nicolas Pouillard aka Ertai