caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] "in" question
@ 2002-11-21 23:35 mzukowski
  2002-11-22  0:04 ` Alessandro Baretta
  2002-11-22  0:29 ` Yang Shouxun
  0 siblings, 2 replies; 3+ messages in thread
From: mzukowski @ 2002-11-21 23:35 UTC (permalink / raw)
  To: caml-list

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>

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

I'm sure it's something fundamental about scoping I'm missing.  Please
enlighten me.

Thanks,

Monty
-------------------
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


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Caml-list] "in" question
  2002-11-21 23:35 [Caml-list] "in" question mzukowski
@ 2002-11-22  0:04 ` Alessandro Baretta
  2002-11-22  0:29 ` Yang Shouxun
  1 sibling, 0 replies; 3+ messages in thread
From: Alessandro Baretta @ 2002-11-22  0:04 UTC (permalink / raw)
  To: mzukowski; +Cc: caml-list



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 
"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 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


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Caml-list] "in" question
  2002-11-21 23:35 [Caml-list] "in" question mzukowski
  2002-11-22  0:04 ` Alessandro Baretta
@ 2002-11-22  0:29 ` Yang Shouxun
  1 sibling, 0 replies; 3+ messages in thread
From: Yang Shouxun @ 2002-11-22  0:29 UTC (permalink / raw)
  To: caml-list

On Friday 22 November 2002 07:35, 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>
>
> 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 ;;

In OCaml "let" can be used in two ways:
1. toplevel declaration "let"
2. local declaration "let...in"

Since "let sum2" is not toplevel, it must be the local form "let...in". 

-------------------
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


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2002-11-22  0:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-11-21 23:35 [Caml-list] "in" question mzukowski
2002-11-22  0:04 ` Alessandro Baretta
2002-11-22  0:29 ` Yang Shouxun

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).