f# – 使用match..with有条件地将值插入序列表达式的最佳方法?

我认为可能匹配..可能像在序列表达式中一样工作:

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

也就是说,我只需要指定匹配的情况,而将失败的情况视为无操作.不幸的是情况并非如此,不匹配会引发异常.

我发现如果我使用屈服,我仍然可以获得理想的结果!像这样:

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

这有效,但这是最好的方法吗?只是想知道是否有更多的标准方法来做到这一点.

最佳答案 Funk的答案是正确的,但你也可以取代收益! []带有一个简单的():

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

计算表达式中的规则是任何计算单元类型(即()值)的表达式都将被该表达式的“零”值替换(无论“零”对于该类型的事物是什么意思).对于列表,“零”值是空列表.当你有一个没有else子句的if语句时,这也是幕后发生的事情:else子句隐式else().所以Funk的答案相当于如果Option.isSome然后产生’b’else(),它在列表表达式中等于如果Option.isSome m然后产生’b’否则产生! [].

希望这个解释清楚,而不是让你进一步混淆;计算表达式总是在他们“点击”然后得到它之前需要一些大脑弯曲.如果您需要更多解释,请告诉我.

点赞