From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id DAA30363; Sat, 10 Nov 2001 03:26:03 +0100 (MET) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id DAA29857 for ; Sat, 10 Nov 2001 03:25:59 +0100 (MET) Received: from transmail12.infosources.fr (transmail12.infosources.fr [212.232.33.78]) by nez-perce.inria.fr (8.11.1/8.10.0) with ESMTP id fAA2Pw519707 for ; Sat, 10 Nov 2001 03:25:58 +0100 (MET) Received: from infonie.fr (mailbox.infonie.fr [195.242.64.77]) by transmail12.infosources.fr (8.11.6/8.11.6) with SMTP id fAA2Pw112148 for ; Sat, 10 Nov 2001 03:25:58 +0100 (MET) Received: from Utilisateur ( Unverified [212.232.44.24] ) by infonie.fr with SMTP id 27291.1669126.750255; Sat, 10 Nov 2001 03:25:57 +0100 Message-ID: <010501c1698e$bc237f40$182ce8d4@Utilisateur> From: "Diego Olivier Fernandez Pons" To: "Caml" References: <009f01c167fe$ebf5e780$2770f2c3@Utilisateur> <15339.34220.198731.791811@lachesis.inria.fr> Subject: Re: [Caml-list] Pattern matching Date: Sat, 10 Nov 2001 03:16:03 +0100 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk An english abstract follows Fabrice Le Fessant a écrit : > (* couples 4 = (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) *) > let couples = function n -> > let rec couplesCPS = function > | (n,_) -> [ ] > | (i,n) -> (i,n) :: couplesCPS (i+1, i+2) > | (i,j) -> (i,j) :: couplesCPS (i, j+1) > in couplesCPS (1,2) > ;; [...] let succ n = n + 1;; Le langage introduit nombre de quantificateurs existentiels ou universels, ne serait-ce que dans la définition même des fonctions : je lis la définition de la fonction successeur : « soit successeur la fonction qui a tout n de N associe (n + 1) ». Cela n'a jamais posé la moindre difficulté aux programmeurs qui, dans la fonction couple - à votre image - comprennent tous que n est déjà liée tandis que i et j ne le sont pas. D'accord, j'utilise quand je peux la syntaxe : let succ = function n -> n + 1;; (mais le compilateur en n'admettant pas let f = function x y -> vous force parfois à utiliser cette horreur de syntaxe) J'emprunte l'exemple (terrifiant !) suivant à David Alexander Madore, lequel d'ailleurs dans son message original servait à illustrer autre chose mais peu importe let x = 42;; let lot f x = print_string "Madame Irma va maintenant répondre à la grande question :\n"; print_string "Le CAML a-t-il une syntaxe aberrante ?"; print_string "(Has CAML a weird syntax ?)"; x+1;; let f x = x+1;; lot f x = x+1;; # val x : int = 42 # val lot : 'a -> int -> int = # val f : int -> int = # Madame Irma va maintenant répondre à la grande question : # Le CAML a-t-il une syntaxe aberrante ? # (Has CAML a weird syntax ?) - : bool = true Revenons au sujet : le problème est que la définition du pattern-matching est déjà en soi étrange let delta = function | 0 -> 1 | _ -> 0 ;; D'accord car on a disjoint l'ensemble de définition let delta = function | i when (i = 0) -> 1 | i -> 0 ;; à mettre en parallèle avec : let delta = function | i when (i = 0) -> 1 | j -> 0 ;; Etrange car on a attrappé deux fois de suite une variable qui prend des valeurs sur tout l'ensemble de définition et on ne comprend pas très bien pourquoi cette variable est muette. Si l'on accepte cela (qui est conséquence de l'absence de liaison explicite de i une seule fois pour toutes), pourquoi n'accepterait-on pas qu'une variable dans le motif soit déjà liée : ce serait tout aussi pratique. Ou alors adopter pour unique syntaxe quelque chose comme let couple = function n -> let rec coupleCPS = function (i,j) -> match (i,j) with | (n,_) -> [ ] | (_,n) -> (i, j) :: coupleCPS (i+1, i+2) | (_,_) -> (i, j) :: coupleCPS (i, j+1) in coupleCPS (1,2) ;; On peut utiliser i, j et n dans les motifs et dans le reste du code car les trois variables ont été liés correctement au préalable < alors le simple fait de definir 'i' avant la fonction < change le sens de la fonction par rapport a quand < 'i' n'etait pas defini ? Voyez un peu le code de Madore ! L'égalité change de sens dans chacune des propositions let f x = x+1;; lot f x = x+1;; Diego Olivier Fabrice said « (It is my translation) How could the compiler know than "i" is a free variable while "n" is not ? And even if he could notice the difference, defining "i" would then change the meaning of the function » The problem is that in the pattern matching, variables i and j seem to be bounded several times (see the delta example).The "let" declaration is omitted (which is very usefull anyway). A strange program by David Madore is provided as well as an alternate syntax for the pattern matching. ------------------- Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr