如何在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