簡體   English   中英

警告意味着什么?

[英]What does the warning mean?

# 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

似乎價值宣言運作得很好,實際上要告訴的警告是什么?

模式[x; y; z] [x; y; z] [x; y; z]不匹配其類型的所有可能值。 通常,您希望避免這樣的模式 - 這意味着您的代碼會出現故障。 在這種特殊情況下(如果您從未更改過代碼),沒有問題,因為模式與常量值匹配。 但是為了以防萬一,編譯器仍在警告你。 也許它認為您可能會在以后更改常量列表。

我不得不說,有一種方法可以禁用這種情況的警告。

寫這個(沒有警告)的慣用方法是:

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

在這種情況下,模式( x, y, z確實匹配其類型的所有可能值。

基本上,任何表達式綁定在編譯時都會轉換為模式匹配,因為可以在綁定符號=的左側繪制模式。 所以它就像你寫的那樣:

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

這有點復雜,但是typechecked的代碼可能與上面的內容相似[1] 在這個設置中,無論你使用簡單的綁定表達式還是完全成熟的match ... with表達式,你都可以看到模式匹配機制相同的好一點。 在這兩種情況下,類型檢查器都會根據表達式的類型推斷出是否存在模式匹配錯過的情況,並向您發出警告。 對於list模式匹配,確實值[]是可能的。


[1]:我說“可能”,因為我相信實際上match ... with句法形式也轉換為另一種形式,這可能更接近function形式(即function [x;y;z] -> ...在你的情況下)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM