F#如何写一个空语句

时间:2010-04-24 11:27:08

标签: f# unit-type

如何在F#中编写无操作语句?

具体来说,我如何改进以下匹配语句的第二个子句:

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

2 个答案:

答案 0 :(得分:30)

使用单位表示空副作用:

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

答案 1 :(得分:16)

Stringer 的答案当然是正确的。我认为澄清这是如何工作可能是有用的,因为“()”实际上不是一个空的陈述或空的副作用......

在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#背景时,这有点令人惊讶,但它使得语言非常优雅和简洁。它不会以任何方式限制您 - 例如,您可以写:

if (a < 10 && (printfn "demo"; true)) then // ...

(这个例子并不真正有用 - 只是演示了灵活性)