当使用“when”时,F#不完整模式匹配此表达式。为什么?

时间:2013-09-09 04:47:07

标签: f# pattern-matching guard-clause

我有这个简单的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#book中的“Pattern Matching”部分看到了一个类似的例子。因此,在F#的后期版本中可能会更改某些内容?

1 个答案:

答案 0 :(得分:17)

我认为答案the previous question(和the comments - “一般情况下,在最后一种模式中设置守卫是一种反模式” - - by kimsk )解释情况。

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

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