我想也许match .. with在序列表达式中可能像if一样工作:

let foo (m: 'a option) =
    [ yield 'a'
      match m with
        | Some _ -> yield 'b'
      yield 'c' ]


也就是说,当失败案例被视为无操作时,我只需要指定匹配的案例即可。不幸的是,情况并非如此,不匹配会引发异常。

我发现如果使用yield!仍然可以达到预期的效果:

let bar (m: 'a option) =
    [ yield 'a'
      match m with
        | Some _ -> yield 'b'
        | _ -> yield! []
      yield 'c' ]


这有效,但这是最好的方法吗?只是想知道是否还有其他标准方法可以做到这一点。

最佳答案

Funk的答案是正确的,但您也可以将yield! []替换为简单的()

let bar (m: 'a option) =
    [ yield 'a'
      match m with
        | Some _ -> yield 'b'
        | _ -> ()
      yield 'c' ]


计算表达式中的规则是,任何计算结果为unit类型(即()值)的表达式都将被该表达式的“零”值替换(“零”表示该类型的事物)。对于列表,“零”值为空列表。当您有一个没有if子句的else语句时,这也是幕后发生的事情:else子句是隐式的else ()。因此,Funk的答案等效于if Option.isSome m then yield 'b' else (),在列表表达式中等效于if Option.isSome m then yield 'b' else yield! []

希望解释清楚,而不是让您进一步困惑。计算表达式在“点击”之前总要花一些脑力。如果您需要更多说明,请告诉我。

07-26 09:35
查看更多