15

これはおそらくばかげた質問だと思いますが...

お互いの値を知る必要のないlet一連のステートメントを連鎖させている場合は、使用する方が良いですか?andin

たとえば、次のいずれが望ましいか。

let a = "foo"
and b = "bar"
and c = "baz"
in
  (* etc. *)

また

let a = "foo" in
let b = "bar" in
let c = "baz"
in
  (* etc. *)

私の直感では、前者は必要最小限のスコープを作成するため、前者は「より良い」(「より良い」の非常に小さな定義による)である必要がありますが、後者はスコープ内のスコープです。コンパイラ/インタプリタが注意を払うスコープですが、最終的には重要ではなく、不必要に深くなります。

4

4 に答える 4

6

そのほうがいいというのが私の意見ですin。の使用はand、定義が相互に依存していることを意味します。そうではないことをはっきりさせたほうがいいと思います。一方で、一部の OCaml プログラマーはand非常に短い定義を好みます。ここでは、少しコンパクトな表記の方がすっきりしているように見えます。これは、定義を 1 行に収めることができる場合に特に当てはまります。

let a = "foo" and b = "bar" in
于 2011-06-15T14:25:05.687 に答える
4

「どっちがいい?」の答え。解釈が異ならない場合にのみ、本当に意味があります。言語の ML ファミリ (少なくとも SML と OCaml) には、並列初期化形式 ( and) と、本質的に入れ子になった順次スコープ形式 ( in) の両方があります。

あなたの場合、セマンティクスは同じなので、「何があなたにとって最も読みやすいですか?」という質問に答える必要があります。そしておそらく(これが時期尚早でない場合)「どちらがより効率的に実行されるでしょうか?」あなたの場合、代替手段は次のとおりです。

  • このand場合: 一連の文字列を評価し、3 つの識別子への並列バインディングを実行します。

  • このin場合: にバインドfooa次に にバインドbarb次に にバインドbazcます。

どっちが読みやすい?この場合、結果は重要ではないため、トスアップです。一部の英語話者に投票することはできますが、あまり好みがあるとは思えません。おそらく大多数は、式の前andにソールを残してバインディングを分離するので気に入るでしょうin.

何がより効率的に実行されるかについては、バインドの順序が問題にならないことを検出できるため、優れたコンパイラは同じコードを生成する可能性が高いと思います。しかし、おそらく、マルチコア プロセッサ用のコードを生成するコンパイラがあり、and. または、すべての RHS を一時ストレージに書き込んでバインドし、andケースを遅くする素朴なコンパイラかもしれません。

これらは、特にバインドが含まれており、タイトなループではない可能性があるため、最適化に関する重要な問題ではない可能性があります。

結論: この場合、それは真のトスアップです。結果が重要な場合は、並列と順次を正しく使用するようにしてください。

于 2011-07-21T01:10:59.877 に答える
2

それはLisp との違いと同じletだと私は信じています。(構造と機能が似ています-質問の2番目の構造)は、式の順次実行を保証するため、命令型プログラミングを隠すために使用されることがあります(OnLispのlet*についてPaulGrahamが言ったことを参照してください)。let*let*in..in..

ですから、前者の方が良いと思います。しかし真実は、私が見たOcamlプログラムでは後者の方が一般的だと思います。おそらく、以前に名前が付けられた式に基づいて1つを構築するのに使用する方が簡単です。

于 2011-06-15T03:48:22.587 に答える
2

スコープを縮小し、意図をより適切に表現するため、 in の方が優れていると言えます。これらすべての定義が共有スコープの方法で連鎖しているのを見ると、それが理由で行われたという印象を受け、それらが互いにどのように影響するかを探しているでしょう.

于 2011-06-15T02:26:08.337 に答える