From: Alessandro Baretta <alex@baretta.com>
To: mzukowski@yci.com
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] "in" question
Date: Fri, 22 Nov 2002 01:04:37 +0100 [thread overview]
Message-ID: <3DDD7495.6070801@baretta.com> (raw)
In-Reply-To: <170826586F3BD511910D0200C110AAA8032B4F3C@memail03.bco-home.com>
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
next prev parent reply other threads:[~2002-11-22 0:04 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-11-21 23:35 mzukowski
2002-11-22 0:04 ` Alessandro Baretta [this message]
2002-11-22 0:29 ` Yang Shouxun
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3DDD7495.6070801@baretta.com \
--to=alex@baretta.com \
--cc=caml-list@inria.fr \
--cc=mzukowski@yci.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox