【问题标题】:F# Incomplete pattern matches on this expression when using "when"..Why?F# 使用“when”时,此表达式上的模式匹配不完整..为什么?
【发布时间】:2013-09-12 13:14:40
【问题描述】:

我有这个简单的 F# 函数:

let compareNum x =
    let y = 10
    match x with
    | _ when x = y -> 0
    | _ when x > y -> 1
    | _ when x < y -> -1

但是,F# 编译器给了我“此表达式的不完整模式匹配”警告。在这种情况下,所有案例都应涵盖所有模式。

我还在 Chris Smith 编写的 Programming F# 书的第一版中的“模式匹配”部分看到了一个类似的示例。那么在 F# 的更高版本中可能会有所改变?

【问题讨论】:

  • 编译器假定任何带有when 保护的代码都是不完全匹配的。它不优雅,并且会产生如您所见的误报。
  • 谢谢!我喜欢上述问题中的一个答案所说的:“一般来说,在最后一个模式中有一个 when 守卫是一种反模式。”我认为现在说得通。
  • 这是使用“if”不仅更惯用的情况之一——它也是一种更好的测试编码方式。

标签: f# pattern-matching guard-clause


【解决方案1】:

我认为the previous question(和the comments)的答案——“一般来说,在最后一个模式中有一个 when 守卫是一种反模式” -- by kimsk) 说明情况。

但是,我不会说在最后一个模式中有一个守卫是一个反模式 - 这是最简单的解决方法,但我觉得这有点不幸,因为when 模式给出了您可以获得有关您可以预期的值的有用信息 - 这使得理解程序更容易。上次我遇到这个问题时,我把它留在那里,至少作为评论:

let compareNum x =
  let y = 10
  match x with
  | _ when x = y -> 0
  | _ when x > y -> 1
  | _ (*when x < y*) -> -1

【讨论】:

  • 谢谢!这真是个好建议。
  • +1,如果您将相等性检查 -&gt; 0 作为最终模式,它可能会在某种程度上保持可读性而无需注释 - 但我个人认为我更喜欢这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2017-09-13
  • 1970-01-01
相关资源
最近更新 更多