如何在F#中編寫禁止語句?F#如何寫空語句
具體來說,我怎麼能改善以下匹配語句的第二句話:空副作用
match list with
| [] -> printfn "Empty!"
| _ -> ignore 0
如何在F#中編寫禁止語句?F#如何寫空語句
具體來說,我怎麼能改善以下匹配語句的第二句話:空副作用
match list with
| [] -> printfn "Empty!"
| _ -> ignore 0
使用單位:
match list with
| [] -> printfn "Empty!"
| _ ->()
從斯金格答案是當然的, ,正確。我想這可能是澄清這是如何工作非常有用,因爲「()」 insn't真空語句或空副作用...
在F#,代碼的每一有效一塊是一個表達式。像let
和match
這樣的結構由一些關鍵字,模式和幾個子表達式組成。爲let
和match
的F#的語法如下:
<expr> ::= let <pattern> = <expr>
<expr>
::= match <expr> with
| <pat> -> <expr>
這意味着let
身體或身體的match
條款人體必須的一些表達。它可以是一些函數調用,如ignore 0
或它可以是一些值 - 在你的情況下,它必須是unit
類型的某種表達式,因爲printfn ".."
也是unit
類型。
unit
類型是隻有一個值,它被寫爲()
(也意味着沒有元素的空元組)。實際上,這與C#中的void
有些類似,但void
不具有任何值。
順便說一句:以下代碼可能看起來像的語句序列,但它也是一個表達式:
printf "Hello "
printf "world"
F#編譯器隱式地增加了兩行和;
之間;
是測序操作者,其具有結構如下:<expr>; <expr>
。它要求第一個表達式返回unit
並返回第二個表達式的結果。
當你來自C#背景時,這有點令人驚訝,但它使得語言令人驚訝的優雅和consise。它不會限制你以任何方式 - 比如,你可以寫:
if (a < 10 && (printfn "demo"; true)) then // ...
(這個例子是不是真的有用 - 只是一個靈活性示範)
凡「()」是價值類型爲「unit」,「unit」是「printfn」的返回類型,有點類似於「void」。 – Brian 2010-04-24 12:20:11
完美,謝謝! – 2010-04-24 12:24:14
我可以將它用於Empty While循環嗎? – fahadash 2014-06-26 19:18:54