2010-04-24 65 views
15

如何在F#中編寫禁止語句?F#如何寫空語句

具體來說,我怎麼能改善以下匹配語句的第二句話:空副作用

match list with 
    | [] -> printfn "Empty!" 
    | _ -> ignore 0 

回答

27

使用單位:

match list with 
    | [] -> printfn "Empty!" 
    | _ ->() 
+2

凡「()」是價值類型爲「unit」,「unit」是「printfn」的返回類型,有點類似於「void」。 – Brian 2010-04-24 12:20:11

+0

完美,謝謝! – 2010-04-24 12:24:14

+0

我可以將它用於Empty While循環嗎? – fahadash 2014-06-26 19:18:54

14

斯金格答案是當然的, ,正確。我想這可能是澄清這是如何工作非常有用,因爲「()」 insn't真空語句或空副作用...

在F#,代碼的每一有效一塊是一個表達式。像letmatch這樣的結構由一些關鍵字,模式和幾個子表達式組成。爲letmatch的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 // ... 

(這個例子是不是真的有用 - 只是一個靈活性示範)