English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
[Caml-list] "in" question
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2002-11-22 (00:04)
From: Alessandro Baretta <alex@b...>
Subject: Re: [Caml-list] "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 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 
(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!


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