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 BAA31443; Fri, 22 Nov 2002 01:04:12 +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 BAA31834 for ; Fri, 22 Nov 2002 01:04:11 +0100 (MET) X-SPAM-Warning: Sending machine is listed in blackholes.five-ten-sg.com Received: from athlon.baretta.com (host167-68.pool80116.interbusiness.it [80.116.68.167]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id gAM049123287 for ; Fri, 22 Nov 2002 01:04:09 +0100 (MET) Received: from baretta.com (localhost.localdomain [127.0.0.1]) by athlon.baretta.com (Postfix) with ESMTP id 7004F2739C; Fri, 22 Nov 2002 01:04:37 +0100 (CET) Message-ID: <3DDD7495.6070801@baretta.com> Date: Fri, 22 Nov 2002 01:04:37 +0100 From: Alessandro Baretta Organization: Baretta srl -- www.baretta.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020826 X-Accept-Language: it, en MIME-Version: 1.0 To: mzukowski@yci.com Cc: caml-list@inria.fr Subject: Re: [Caml-list] "in" question References: <170826586F3BD511910D0200C110AAA8032B4F3C@memail03.bco-home.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk mzukowski@yci.com wrote: > I've been working through Jason Hickey's introduction to Objective Caml and > don't quite get why the "in" is necessary in this construct: > > # let sum i = let sum2 j = i + j in sum2 ;; > val sum : int -> int -> int = You definitely need "in"; here's why. The keyword "let" defines a binding. Now you will see the meaning of the above code if you indent it appropriately. let sum i = (* Bind "sum" with the following expr *) let sum2 j = (* Wait a sec! First bind "sum2" with...*) i + j (* ...this. Now what about "sum"? *) in sum2 (* Alright. Now we bound "sum" as well *) > If I leave out the "in" I get a generic "Syntax error": > > # let sum i = let sum2 j = i + j ;; > Characters 31-33: > let sum i = let sum2 j = i + j ;; > ^^ > Syntax error That's right. You declared you were going to bind "sum" with an expression, but you did not specify any expression. You just bound "i + j" with "sum2", not with "sum". > I'm sure it's something fundamental about scoping I'm missing. Please > enlighten me. I gave you an informal explanation. You can find an explanation of the formal semantics of the "let ... in ..." construct (alas, in french!) at "http://www.enseignement.polytechnique.fr/informatique/M2/lp/" (Cours 2). Briefly stated, and all typing considerations set aside, > let x = in is equivalent to > (fun x -> ) Let's apply this rule to the correct code. > # let sum i = let sum2 j = i + j in sum2 You first have to expand the definition of functions: > let sum = fun i -> let sum2 = fun j -> i + j in sum2 Then we can apply the above mentioned equivalence once... > let sum = fun i -> ((fun sum2 -> sum2) (fun j -> i + j)) ^^^^^^^^^^^^^^^^ ...then we recognize an application of the identity function and obtain... > let sum = fun i -> fun j -> i + j ...which we can represent in a more compact fashio as... > let sum i j = i + j ...which is what we wanted. Not really straightforward until you get the hang of functional languages. But it's cool, in the end. > Thanks, > > Monty Have fun! Alex ------------------- 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