警告意味着什么?

new*_*erl 3 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
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*eld 5

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

我不得不说,有一种方法可以禁用这种情况的警告.

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

let x, y, z = 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

在这种情况下,pattern(x, y, z)确实匹配其类型的所有可能值.