【发布时间】: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 时遇到了问题。我尝试使用快捷语法导致了一个错误。
所以我的问题是:
- 我的解释正确吗?
- 除了在单独的行上列出每个模式之外,还有其他解决方法吗?
【问题讨论】:
标签: f#