我认为可能匹配..可能像在序列表达式中一样工作:
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’否则产生! [].
希望这个解释清楚,而不是让你进一步混淆;计算表达式总是在他们“点击”然后得到它之前需要一些大脑弯曲.如果您需要更多解释,请告诉我.