[Camllist] "in" question

mzukowski@y...
 Alessandro Baretta
 Yang Shouxun
[
Home
]
[ Index:
by date

by threads
]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
Date:  20021122 (00:04) 
From:  Alessandro Baretta <alex@b...> 
Subject:  Re: [Camllist] "in" question 
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 = <fun> 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 3133: > 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 = <term1> in <term2> is equivalent to > (fun x > <term2>) <term1> 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 camllistrequest@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/camlbugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners