一部OCamlのコードでOcamlの "let()="は何を意味しますか?
let() = print_string "something" in
fn
のようなコードがあります。
これはどういう意味ですか? "()"に特別な意味がありますか?またはそれは、それだけでパターンこのlet
表現で()
についての特別なことは何もありませんです
print_string "something";
fn
一部OCamlのコードでOcamlの "let()="は何を意味しますか?
let() = print_string "something" in
fn
のようなコードがあります。
これはどういう意味ですか? "()"に特別な意味がありますか?またはそれは、それだけでパターンこのlet
表現で()
についての特別なことは何もありませんです
print_string "something";
fn
と同じ意味です。すべてのlet
式はlet
pattern
=
expression
in
other-expression
のように見えます。ここでは、print_string
がunit
を返し、()
がそのタイプの唯一の値であるため、パターンは常に一致します。この方法では、最初のものが本当に文のほうが多いときに2つの式を1つにまとめる別の方法です(unit
を返します)。
あなたは正しいので、構造体は;
演算子を使用するのとほとんど同じ意味を持ちます。唯一の違いは優先順位です。たとえば、あなたが
if x < 3 then
print_string "something";
f x
を書く場合はf x
と呼ばれる常にであることを見つけるだろう。 ;
の優先順位は、if
の制御下で2番目の式を引き出すには低すぎます。それは多くの人々(私を含む)が使用の習慣に入る理由です。let() =
expression
あなたは
if x < 3 then
let() = print_string "something"
in f x
x
は私が欲しいもの通常である、3未満の場合にのみ呼び出されf x
として上記を記述する場合。本質的には、let
の優先順位は;
よりはるかに高いです。
もちろん、この効果を得る他の方法があるかもしれませんが、let
を使うことについての良い点は、後で何かをコードに追加する必要がないことです(閉じ括弧やend
など)。デバッグ文としてprint_string
を追加している場合、これは変更を1つの場所にローカルに保存する便利な方法です。
驚くべきプログラムのもう一つの例として、通常の算術法則のときだけ 'f()'を実行したい場合、 'let 4 = 2 + 2をf()に書くことができます。 ; ' –
ジェフリーの答えは絶対に正しいですが、もう一つのポイント:あなたが
fx "something";
fn
を書いて、あなたは、コンパイラが警告を発しますfx "something"
の結果の型を台無し場合
、それが中に失われる可能性がありますコンパイル。一方、あなたは書いた場合:
let() = fx "something" in
fn
コンパイラはそれが本当にタイプunit
のあること、すなわち、fx "something"
の結果は()
と照合できることを確認入力します。したがって、あなたが混乱した場合、通常はより安全なエラーが生成されます。
はまた、唯一のジェフリーが言及した先行音効果を得るが、_
は任意の型の値に対して一致させることができるので、任意の型チェックを行うことはありません
let _ = fx "something" in
fn
を書くための可能性があります。
と最後のものは 'ignore(fx" something ")と同等です。セミコロン表記の「fn」 – newacct
'let _ = ... 'は排他的に使用したいと思うかもしれませんが、すべてではないにしても大部分の式で有効です。 –
'let _ = ...'、または壊れやすいパターンマッチングは、絶対に推奨されません。タイプシステムに中指を当てるのとほぼ同じです。 – nlucaroni
私はnlucaroniに同意します。あなたが 'let _ = ... in ...'を望むなら、 'ignore(...); ... ' – newacct