Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

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: -- (:)
From: Alessandro Baretta <alex@b...>
Subject: Re: [Caml-list] "in" question 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 Archives:
Bug reports: FAQ:
Beginner's list: