4

JasonHickeyのObjectiveCaml入門を学んでいます。表現のことについて質問してください。


だからそれは言う:

Definitions using let can also be nested using the in form.

let identifier = expression1 in expression2 The expression expression2 is called the body of the let. The variable named identifier is defined as the value of expression1 within the body. The identifier is defined only in the body expression2 and not expression1.

A let with a body is an expression; the value of a let expression is the value of the body.

let x = 1 in
    let y = 2 in
        x + y;;


let z =
    let x = 1 in
        let y = 2 in
            x + y;;

val z : int = 3


Ok。私は上記のステートメントについてあまり理解していません。

初め

The variable named identifier is defined as the value of expression1 within the body. The identifier is defined only in the body expression2 and not expression1.

これは何を意味するのでしょうか?identifierですがthe value of expression1、体の中だけexpression2ですか?identifierそれはでのみ有効ですexpression2が、の価値があるという意味expression1ですか?それでは、定義identifierは意味がありexpression2ますか?

2番

例を見てみましょう:

let x = 1 in
    let y = 2 in
        x + y;;

letですから、この声明の要点はわかりません。x = 1確かに、体を与えることのポイントは何let y=2 in x+y;;ですか?

第3

let z = let x = 1 in let y = 2 in x + y ;;

では、どうすればこのステートメントのロジックを整理できますか?

この定義形式を取る場合:let identifier = expression1 in expression2

expression1上記のletステートメントの内容は何ですか?それlet x = 1ですか?


nesting let誰かが私にある種の方法での論理を教えてもらえますJavaか?またはより理解しやすい方法?

4

2 に答える 2

4

これは何を意味するのでしょうか?つまり、識別子はexpression1の値ですが、body expression2のみですか?識別子はexpression2でのみ有効ですが、expression1の値を持っているという意味ですか?

はい。を実行するとlet x = 42 in x+x、式にxは値が含まれますが、式の外部には値がありません。したがって、インタプリタで次のように入力した場合:42x+xxlet

let x = 42 in x+x;;
x*2;;

の結果はにx+xなりますが、そのスコープで定義されていないため84、の結果はx*2エラーになります。x

それでは、式2にのみあるので、識別子を定義することは意味がありますか?

もちろん?つまり、が単一の数値として定義されているこの特定の例でxは、それほど意味がないかもしれませんが、実際のシナリオでは、おそらくより大きな式であり、複数回繰り返す必要がないことが大きな利点になります。

またexpression1、一度だけ実行したい副作用がある場合もあります(たとえば、ユーザー入力を変数に割り当てたい場合)。

したがって、このletステートメントのポイントはわかりません。x = 1確かに、x+yでlety= 2の本体を与えることのポイントは何ですか;;?

つまり、なぜ単に書くのではないの1+2ですか?繰り返しになりますが、実際のシナリオでは、より複雑な式があり、それらすべてを1行にまとめたくはありません。また、値に名前を付けると、一般的に読みやすさが向上します(ただし、この例では実際にはそうではありません)。

let z = let x = 1 in let y = 2 in x + y ;;

上記のletステートメントのexpression1は何ですか?x = 1にしますか?

これlet z = ...letステートメントです。つまり、名前zをグローバルに定義し、本文はありません。したがって、最初の式の右側にある式全体=がの値ですzlet x = ... in ...ビットの場合、は1でありexpression1let y = 2 in x+yexpression2です。そして、y 2はとです。expression1x+yexpression2

于 2012-11-30T17:26:10.887 に答える
1

これは何を意味するのでしょうか?つまり、識別子はexpression1の値ですが、body expression2のみですか?識別子はexpression2でのみ有効ですが、expression1の値を持っているということですか?それでは、式2にのみあるので、識別子を定義することは意味がありますか?

それが意味することです、はい、しかしもっと簡単に言えば、それはあなたが「それ自身の価値で」識別子を使うことができないことを意味します。expression1の値を識別子にバインドした後、expression2でexpression1全体の代わりに識別子を使用できます。

一般に、バインディングを使用する理由は2つあります。1は特定の式の複数の評価を防ぐためのものであり、2は明確にするためのものです。比較的複雑な式の値に人間が読める名前を付けると便利なことがよくあります。

Javaに関しては、letバインディングはおおよそローカル変数に対応します。

于 2012-11-30T17:22:49.187 に答える