gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:22:06 24 4
gpt4 key购买 nike

我认为 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屈服! [].

希望这个解释是清楚的,而不是让您进一步感到困惑;计算表达式在它们“咔哒”一声你就明白之前总是需要费点脑筋。如果您需要更多解释,请告诉我。

关于f# - 使用 match..with 有条件地将值插入序列表达式的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43796784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com