我想也许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! []
。希望解释清楚,而不是让您进一步困惑。计算表达式在“点击”之前总要花一些脑力。如果您需要更多说明,请告诉我。