2010-04-24 69 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 // ... 

(这个例子是不是真的有用 - 只是一个灵活性示范)