警告意味着什么?

时间:2013-01-27 10:59:48

标签: ocaml

# let [x;y;z] = [1;2;3];;
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
val x : int = 1
val y : int = 2
val z : int = 3
# x;;
- : int = 1
# y;;
- : int = 2
# z;;
- : int = 3

似乎价值宣言运作得很好,实际上要告诉的警告是什么?

2 个答案:

答案 0 :(得分:5)

模式[x; y; z]与其类型的所有可能值都不匹配。通常,您希望避免这样的模式 - 这意味着您的代码会出现故障。在这种特殊情况下(如果您从未更改过代码),没有问题,因为模式与常量值匹配。但是为了以防万一,编译器仍在警告你。也许它认为你可能会在以后更改常量列表。

如果有一种方法来禁用这种情况的警告会很好,我不得不说。

写这个的惯用方法(没有警告)是:

let x, y, z = 1, 2, 3

在这种情况下,模式(x, y, z 匹配其类型的所有可能值。

答案 1 :(得分:0)

基本上,任何表达式绑定都会在编译时转换为模式匹配,因为可以在绑定符号=的左侧绘制一个模式。所以它就像你写的那样:

let x,y,z = 
    let v =  [1;2;3] in
    match v with
      | [x;y;z] -> x,y,z

这有点令人费解,但是类型检查的代码可能与上面的 [1] 相似。在此设置中,无论使用简单绑定表达式还是完全成熟的match ... with表达式,您都可以看到模式匹配机制相同的更好一点。在这两种情况下,类型检查器都会根据表达式的类型推断出是否存在模式匹配错过的情况,并向您发出警告。对于list模式匹配,确实值[]是可能的。


[1]:我说"可以" ,因为我相信实际上match ... with句法形式也被转换为另一种形式,它可能更接近function形式(即你的function [x;y;z] -> ...形式)。