2011-09-23 8 views
9

一部OCamlのコードでOcamlの "let()="は何を意味しますか?

let() = print_string "something" in 
fn 

のようなコードがあります。

これはどういう意味ですか? "()"に特別な意味がありますか?またはそれは、それだけでパターンこのlet表現で()についての特別なことは何もありませんです

print_string "something"; 
fn 
+0

'let _ = ... 'は排他的に使用したいと思うかもしれませんが、すべてではないにしても大部分の式で有効です。 –

+1

'let _ = ...'、または壊れやすいパターンマッチングは、絶対に推奨されません。タイプシステムに中指を当てるのとほぼ同じです。 – nlucaroni

+0

私はnlucaroniに同意します。あなたが 'let _ = ... in ...'を望むなら、 'ignore(...); ... ' – newacct

答えて

11

と同じ意味です。すべてのlet式はletpattern=expressioninother-expressionのように見えます。ここでは、print_stringunitを返し、()がそのタイプの唯一の値であるため、パターンは常に一致します。この方法では、最初のものが本当に文のほうが多いときに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つの場所にローカルに保存する便利な方法です。

+0

驚くべきプログラムのもう一つの例として、通常の算術法則のときだけ 'f()'を実行したい場合、 'let 4 = 2 + 2をf()に書くことができます。 ; ' –

3

ジェフリーの答えは絶対に正しいですが、もう一つのポイント:あなたが

fx "something"; 
fn 

を書いて、あなたは、コンパイラが警告を発しますfx "something"の結果の型を台無し場合

、それが中に失われる可能性がありますコンパイル。一方、あなたは書いた場合:

let() = fx "something" in 
fn 

コンパイラはそれが本当にタイプunitのあること、すなわち、fx "something"の結果は()と照合できることを確認入力します。したがって、あなたが混乱した場合、通常はより安全なエラーが生成されます。

はまた、唯一のジェフリーが言及した先行音効果を得るが、_は任意の型の値に対して一致させることができるので、任意の型チェックを行うことはありません

let _ = fx "something" in 
fn 

を書くための可能性があります。

+0

と最後のものは 'ignore(fx" something ")と同等です。セミコロン表記の「fn」 – newacct

関連する問題