2011-09-23 33 views
9

有喜歡Ocaml中的「let()=」是什麼意思?

let() = print_string "something" in 
fn 
在一些OCaml的代碼

代碼。

這是什麼意思? 「()」有特殊含義嗎?或者是相同的意思

print_string "something"; 
fn 
+0

您可能會想專門使用'let _ = ...',因爲它適用於大多數(如果不是全部)表達式。 –

+1

'let _ = ...',或者脆弱的模式匹配,絕對不推薦。這幾乎相當於將中指放在類型系統上。 – nlucaroni

+0

我同意nlucaroni。如果你想'let _ = ... in ...',那麼你可能想'忽略(...); ...' – newacct

回答

11

沒有什麼特別之處()在這個let表達,它只是一個模式。所有let表情看起來像letpattern=expressioninother-expression。此處的模式將始終匹配,因爲print_string返回unit,並且()是該類型的唯一值。這樣,當第一個表達式更多地是一個語句(返回unit)時,它就是將兩個表達式合併成一個表達式的另一種方式。

所以你是對的,這個結構與使用;運算符的含義幾乎相同。唯一真正的區別在於優先級。如果,例如,你寫

if x < 3 then 
    print_string "something"; 
    f x 

,你會發現,f x總是調用。 ;的優先級太低而無法在if的控制下拉第二個表達式。這就是很多人(包括我)習慣於使用let() =expression的原因。如果你寫了上面

if x < 3 then 
    let() = print_string "something" 
    in f x 

f xx小於3,通常是我想要的東西纔會被調用。本質上,let的優先級比;高得多。

當然,也有其他方法可以獲得這種效果,但使用let的好處是您不必在代碼中稍後添加任何內容(如右括號或end)。如果您將print_string作爲調試語句添加,這是將更改保持在一個地方的便捷方式。

+0

作爲語法允許的令人驚訝的程序的另一個例子,如果你只想在通常的算術定律保持時執行'f()',你可以在f()中寫'let 4 = 2 + 2。 ;' –

3

傑弗裏的答案是絕對正確的,但多了一個點:

,如果你寫

fx "something"; 
fn 

你搞砸的fx "something"的結果類型,編譯器會發出警告,這可能會期間丟失彙編。在另一方面,如果你寫:

let() = fx "something" in 
fn 

編譯器將類型檢查的fx "something"結果可以針對()匹配,即它是真的unit類型。因此,如果你弄錯了一個錯誤,通常會更安全。

也有寫

let _ = fx "something" in 
fn 

這隻會傑弗裏提到的優先效應,但不能做任何類型檢查,因爲_可以對任何類型的值相匹配的可能性。

+0

,最後一個等同於'ignore(fx「something」); fn'用分號表示 – newacct