代码之家  ›  专栏  ›  技术社区  ›  Eamon Nerbonne

f如何编写空语句

  •  17
  • Eamon Nerbonne  · 技术社区  · 15 年前

    我怎样才能在f中写一个无操作语句?

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

    match list with
        | [] -> printfn "Empty!"
        | _ -> ignore 0
    
    2 回复  |  直到 9 年前
        1
  •  30
  •   elmattic    15 年前

    空副作用使用单位:

    match list with
      | [] -> printfn "Empty!"
      | _ -> ()
    
        2
  •  16
  •   Tomas Petricek    15 年前

    答案来自 桁条 当然是正确的。我认为澄清这一点可能有用,因为“()”不是一个空洞的陈述或空洞的副作用…

    在F, 每一段有效的代码都是一个表达式 . 构造类似 let match 由一些关键字、模式和几个子表达式组成。的F语法 比赛 如下所示:

    <expr> ::= let <pattern> = <expr>
               <expr>
           ::= match <expr> with
               | <pat> -> <expr>
    

    这意味着 或第条的正文 比赛 必须是某种表达式。它可以是一些函数调用,例如 ignore 0 或者它可以是某个值-在您的示例中,它必须是某种类型的表达式 unit ,因为 printfn ".." 也属于类型 单元

    这个 单元 类型是一个只有一个值的类型,它写为 () (它也意味着没有元素的空元组)。这确实有点类似于 void 在C中,除了 无效 没有 任何 价值观。

    btw:下面的代码可能看起来像一系列语句,但它也是一个表达式:

    printf "Hello "
    printf "world"
    

    F编译器隐式添加 ; 两条线之间 ; 是一个序列运算符,它具有以下结构: <expr>; <expr> . 它要求第一个表达式返回 单元 并返回第二个表达式的结果。

    当你来自C背景时,这有点让人惊讶,但它让兰格奥格出奇的优雅和体贴。它不会以任何方式限制您-例如,您可以编写:

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

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