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

kim*_*msk 13 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
Run Code Online (Sandbox Code Playgroud)

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

我还在Chris Smith的第1版Programming F#book中的"Pattern Matching"部分看到了一个类似的例子.所以在F#的后期版本中可能会改变某些内容?

Tom*_*cek 18

我认为前一个问题的答案(以及评论 - "一般情况下,在最后一个模式中有一个守卫的反模式" - kimsk解释).

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

let compareNum x =
  let y = 10
  match x with
  | _ when x = y -> 0
  | _ when x > y -> 1
  | _ (*when x < y*) -> -1
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这是非常好的建议. (2认同)
  • +1,如果你有相同的检查` - > 0`作为最终模式,它可能会在没有评论的情况下保持可读性 - 但我个人认为我更喜欢这个. (2认同)