let() = print_string "something" in
fn
在一些OCaml的代碼
代碼。
這是什麼意思? 「()」有特殊含義嗎?或者是相同的意思
print_string "something";
fn
let() = print_string "something" in
fn
在一些OCaml的代碼
代碼。
這是什麼意思? 「()」有特殊含義嗎?或者是相同的意思
print_string "something";
fn
沒有什麼特別之處()
在這個let
表達,它只是一個模式。所有let
表情看起來像let
pattern
=
expression
in
other-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 x
時x
小於3,通常是我想要的東西纔會被調用。本質上,let
的優先級比;
高得多。
當然,也有其他方法可以獲得這種效果,但使用let
的好處是您不必在代碼中稍後添加任何內容(如右括號或end
)。如果您將print_string
作爲調試語句添加,這是將更改保持在一個地方的便捷方式。
作爲語法允許的令人驚訝的程序的另一個例子,如果你只想在通常的算術定律保持時執行'f()',你可以在f()中寫'let 4 = 2 + 2。 ;' –
傑弗裏的答案是絕對正確的,但多了一個點:
,如果你寫
fx "something";
fn
你搞砸的fx "something"
的結果類型,編譯器會發出警告,這可能會期間丟失彙編。在另一方面,如果你寫:
let() = fx "something" in
fn
編譯器將類型檢查的fx "something"
結果可以針對()
匹配,即它是真的unit
類型。因此,如果你弄錯了一個錯誤,通常會更安全。
也有寫
let _ = fx "something" in
fn
這隻會傑弗裏提到的優先效應,但不能做任何類型檢查,因爲_
可以對任何類型的值相匹配的可能性。
,最後一個等同於'ignore(fx「something」); fn'用分號表示 – newacct
您可能會想專門使用'let _ = ...',因爲它適用於大多數(如果不是全部)表達式。 –
'let _ = ...',或者脆弱的模式匹配,絕對不推薦。這幾乎相當於將中指放在類型系統上。 – nlucaroni
我同意nlucaroni。如果你想'let _ = ... in ...',那麼你可能想'忽略(...); ...' – newacct