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

时间:2017-05-05 04:54:30

标签: f#

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

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

也就是说,我只需要指定匹配的case,而fail case被视为no-op。不幸的是情况并非如此,不匹配会引发异常。

我发现如果我像这样使用yield!,我仍然可以获得所需的结果:

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

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

1 个答案:

答案 0 :(得分:2)

Funk的回答是正确的,但你也可以用简单的{ "id": "00053", "cssLevel": "53", "username": "user53", "Title": "title53"} { "id": "00054", "cssLevel": "54", "username": "user54", "Title": "title54"} and then <div class="{{cssLevel}}">{{model.username}}</div> or <div v-bind:class="cssLevel">{{model.username}}</div>替换yield! []

()

计算表达式中的规则是任何计算为let bar (m: 'a option) = [ yield 'a' match m with | Some _ -> yield 'b' | _ -> () yield 'c' ] 类型的表达式(即unit值)将被该表达式替换为&#34; s&#34;零&# 34;价值(无论什么&#34;零&#34;意味着什么类型的东西)。对于列表,&#34;零&#34; value是空列表。当你有一个没有()子句的if语句时,这也是 幕后发生的事情:else子句隐含else。所以Funk的答案相当于else (),它在列表表达式中相当于if Option.isSome m then yield 'b' else ()

希望这个解释清楚,而不是让你进一步混淆;计算表达式在他们&#34;点击&#34;之前总是需要一些大脑弯曲。你明白了如果您需要更多解释,请告诉我。