【问题标题】:Ambiguity in pattern matching syntax模式匹配语法中的歧义
【发布时间】:2016-06-22 15:06:55
【问题描述】:

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

type Thing =
    | This
    | That
    | Other

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

在上面的场景中,编译器告诉我第二条规则永远不会匹配。但是,如果我尝试使代码更紧凑并编写了

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

我没有从编译器那里得到任何帮助。我认为原因是| This | That ->. "A" 不是| This -> "A" | That -> "A" 的快捷方式,尽管它看起来很像(而且我已经看到很多代码示例都是这样处理的)。相反,据我所知,管道符号既用于分隔单个模式,也用作 OR 模式。

这对大多数 DU 来说不是什么大问题,但是我在将一个包含大量案例的 DU 映射到另一个包含少量案例的 DU 时遇到了问题。我尝试使用快捷语法导致了一个错误。

所以我的问题是:

  1. 我的解释正确吗?
  2. 除了在单独的行上列出每个模式之外,还有其他解决方法吗?

【问题讨论】:

    标签: f#


    【解决方案1】:

    你的解释是正确的。

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

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

    中变得不那么明显了
    let useThing =
        function
        | This
        | That -> "A"
        | That
        | Other -> "B"
    

    但是,编译器可以判断整个模式是否无用,但不能简化模式。 That | Other 具有有效匹配,因此编译器认为不是多余的。
    您可以考虑更多涉及的模式,其中完全不清楚是否可以省略部分或如何简化它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多