如何在F#中编写无操作语句?
具体来说,我如何改进以下匹配语句的第二个子句:
match list with
| [] -> printfn "Empty!"
| _ -> ignore 0
答案 0 :(得分:30)
使用单位表示空副作用:
match list with
| [] -> printfn "Empty!"
| _ -> ()
答案 1 :(得分:16)
Stringer 的答案当然是正确的。我认为澄清这是如何工作可能是有用的,因为“()”实际上不是一个空的陈述或空的副作用......
在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#背景时,这有点令人惊讶,但它使得语言非常优雅和简洁。它不会以任何方式限制您 - 例如,您可以写:
if (a < 10 && (printfn "demo"; true)) then // ...
(这个例子并不真正有用 - 只是演示了灵活性)