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 RAA18215; Wed, 7 May 2003 17:59:08 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id RAA17555 for ; Wed, 7 May 2003 17:59:06 +0200 (MET DST) Received: from mail.npc.de (fw.npc.de [62.225.140.214]) by concorde.inria.fr (8.11.1/8.11.1) with ESMTP id h47Fx5H20266 for ; Wed, 7 May 2003 17:59:05 +0200 (MET DST) Received: from p5080FB4E.dip.t-dialin.net (lion.npc.de [192.168.129.1]) by mail.npc.de (Postfix) with ESMTP id 986EE1351; Wed, 7 May 2003 17:59:04 +0200 (CEST) Received: from hera.ffm.npc.de (hera.ffm.npc.de [192.168.130.8]) by p5080FB4E.dip.t-dialin.net (Postfix STYX NPC GmbH) with ESMTP id 8A4CB78E0; Wed, 7 May 2003 17:59:02 +0200 (CEST) Received: from ares.ffm.npc.de (ares.ffm.npc.de [192.168.130.32]) by hera.ffm.npc.de (Postfix HERA NPC GmbH) with ESMTP id 07F59159BB; Wed, 7 May 2003 17:59:01 +0200 (CEST) Received: from ares.ffm.npc.de (ares.ffm.npc.de [192.168.130.32]) by ares.ffm.npc.de (Postfix ARES NPC GmbH) with ESMTP id BE705183A; Wed, 7 May 2003 17:59:01 +0200 (CEST) Subject: Re: [Caml-list] why the "rec" in "let rec"? From: Gerd Stolpmann To: Hal Daume III Cc: Neel Krishnaswami , "caml-list@inria.fr" In-Reply-To: References: Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Ximian Evolution 1.0.8 Date: 07 May 2003 17:59:01 +0200 Message-Id: <1052323141.16633.108.camel@ares> Mime-Version: 1.0 X-Spam: no; 0.00; gerd:01 stolpmann:01 caml-list:01 neel:01 krishnaswami:01 hodgson:01 recursion:01 disallow:01 bug:01 abstraction:01 combinators:01 viktoriastr:01 64293:01 darmstadt:01 compiler:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk Am Mit, 2003-05-07 um 16.57 schrieb Hal Daume III: > Hi all, > > On Wed, 7 May 2003, Neel Krishnaswami wrote: > > > Garry Hodgson writes: > > > > > > something i was always curious about: why do you need to > > > specify the "rec" in a "let rec" function definition? as opposed > > > to, say, having the compiler figure out when a function is recursive? > > > > It's the simplest way of dealing with the interaction of lexical scope > > and recursion. Consider the following examples: > > Both responses so far have pointed out how it's different from jsut 'let', > but I don't think this was the point of the question. Arguably, the > "simplest" way to dealing with: > > > let f x = .. > > let f x = f x > > is to simply disallow bindings like this. I would think that they're > almost always a bug. Especially if the first definition appears at the > top of your file and the second (perhaps you forgot the "rec" and the body > is actually long) appears at the bottom. Likely it would turn out to be a > type error anyway, but why risk it? > > Anyway, I think the question was more along the lines of "why let the > programmer do something like this." I cannot answer that. I think the reason is that "let" is theoretically derived from the lambda construct, e.g. let f x = e does the same as the anonmyous counterpart (fun x -> e) and the scoping rules for "fun" (coming from a mathematical theory) are also applied to "let", so you have always the same scoping rules, except when you explicitly select a different rule, as in "let rec". That ML has a theoretical foundation makes this language different from others. There are often theorerical reasons for things that are commonly only seen from a practical point of view. The foundation says that "let" and "let rec" are very different constructs. As mentioned, "let" is another notation for "fun" which is lambda abstraction (to be exact, this is not 100% true for Ocaml, because different typing rules are used for "let" and "fun" with different strengths). "let rec" has no direct counterpart in the lambda calculus, and must be emulated with so-called combinators. As far as I remember, typing of recursive combinators is impossible, and so the language foundation must be "augmented" by additional theories that are not as strong as the lambda calculus. I am not an expert for "let rec" typechecking, but I suppose the capabilities of the compiler are limited because there is the risk that the typechecker itself loops endlessly. To summarize, the difference between "let" and "let rec" is that they are based on theories with different strengths, and the language designers don't want to unify such constructs (IMHO, a good attitude). Gerd -- ------------------------------------------------------------ Gerd Stolpmann * Viktoriastr. 45 * 64293 Darmstadt * Germany gerd@gerd-stolpmann.de http://www.gerd-stolpmann.de ------------------------------------------------------------ ------------------- 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