3
# 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

値の宣言は非常にうまく機能しているようですが、警告は実際に何を伝えようとしているのでしょうか?

4

2 に答える 2

5

パターン[x; y; z]は、そのタイプのすべての可能な値と一致しません。一般に、このようなパターンは避けたいと考えています。これは、コードが失敗する場合があることを意味します。この特定のケース (コードをまったく変更しない場合) では、パターンが定数値と照合されるため、問題はありません。しかし、念のため、コンパイラはとにかく警告しています。おそらく、後で定数リストを変更する可能性があると考えられます。

このような場合の警告を無効にする方法があればいいと思います。

これを(警告なしで)書く慣用的な方法は次のとおりです。

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

この場合、パターン ( x, y, z)、そのタイプのすべての可能な値に一致します。

于 2013-01-27T14:53:56.500 に答える
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] -> ...

于 2013-01-28T01:34:32.617 に答える