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


我有这个简单的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#的后期版本中可能会改变某些内容?


9583
2017-09-09 04:47


起源

编译器假定任何代码都带有 when 警卫是一个不完整的比赛。它不够优雅,并且像你看到的那样产生误报。 - John Palmer
可能重复 与F#中的元组匹配的不完整模式 - John Palmer
谢谢!我喜欢上面问题中的一个答案如何说:“总的来说,在最后一个模式中拥有一个守卫是一种反模式。”我认为现在有道理。 - kimsk
这是使用“if”不仅更加惯用的情况之一 - 它也是一种更好的编码测试方法。 - Onorio Catenacci


答案:


我想答案 上一个问题 (和 评论  - “总的来说,在最后一个模式中拥有守卫是一种反模式”  - 通过 kimsk


16
2017-09-09 05:52



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