gpt4 book ai didi

f# - 模式匹配语法中的歧义

转载 作者:行者123 更新时间:2023-12-03 14:19:43 25 4
gpt4 key购买 nike

今天,我遇到了F#模式匹配语法中的一个奇怪问题,这可能导致穷举性检查中明显的失败。

type Thing =
| This
| That
| Other

let useThing =
function
| This -> "A"
| That -> "A"
| That -> "B" // compiler complains
| Other -> "B"


在上述情况下,编译器会很有帮助地告诉我,第二条That规则将永远不会被匹配。但是,如果我试图使代码更紧凑并编写

let useThing =
function
| This | That -> "A"
| That | Other -> "B"


我没有从编译器获得任何帮助。我认为原因是 | This | That ->. "A"并不是 | This -> "A" | That -> "A"的快捷方式,即使它看起来非常像(我已经看过很多代码样例将其视为这样)。取而代之的是,根据我的发现,管道符号既用于分隔各个模式,也用作OR模式。

对于大多数DU而言,这不是一个大问题,但是当将具有大量案例的DU映射到具有少量案例的另一个DU时,我遇到了问题。我尝试使用快捷方式语法引起了一个错误。

所以我的问题是:


我的解释正确吗?
除了在单独的行中列出每个模式之外,是否有其他解决方法?

最佳答案

您的解释是正确的。

通过省略第一个This和第二个That的操作,您将创建Pattern Matching (F#)中所述的OR模式

对我来说,这也有点令人困惑,因为逻辑“或”是||。在F#中。
虽然很容易在格式中看到第一栏为new alternative,第二栏为or,但在

let useThing =
function
| This
| That -> "A"
| That
| Other -> "B"


但是,编译器可以判断整个模式是否无用,但无法简化模式。
That | Other具有有效的匹配项,因此按照编译器的考虑不是多余的。
您可以想到更多涉及的模式,如果可以省去零件或如何简化它们,则根本不清楚。

关于f# - 模式匹配语法中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37971916/

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