私はOCamlでの引数の既知のリストに関数を適用するとき、どのように私は警告を回避することができますか?
-
12-09-2019 - |
質問
どのように私は、a
など、そのようなことb
をc
をa'
するためにいくつかの値のb'
、c'
、x'=f(x)
などを変換することができますか?値は、特定の名前に結合され、その量は、コンパイル時に知られている。
私は次のようにリストに関数を適用しようとします:
let [a';b'] = List.map f [a;b] in ...
しかし、それは警告を生成します:
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
それを避けるために、任意の方法?
解決
あなたは均一なタプル、すなわち上へのマッピングのためのいくつかの関数を書くことができます。
let map4 f (x,y,z,w) = (f x, f y, f z, f w)
let map3 f (x,y,z) = (f x, f y, f z)
let map2 f (x,y) = (f x, f y)
、必要に応じていつでも、あなたはそれらを使用することができます。
let (x',y') = map2 f (x,y)
他のヒント
残念ながらありません。あなたが書き込むことによって、コンパイラを黙らすることができます。
match List.map f [a;b] with
[a';b'] -> ...
| _ -> assert false
それがすべてです。
コンパイラはここであなたを助けようとしています。それはあなたが[a';b']
に未知のリストを割り当てるしようとしていることを示しています。どのような最初のリスト、[a;b]
ように、一年後、あなたがこのコードを変更した場合、あなたはそれを見ていないので、コード内の別の場所にリファクタリングされ、そのの、時にはfが変更されました>別のリストを返しますか?その後、の、時にはは間違ったリストを[a';b']
に一致するようにしようと実行時例外が発生します。コンパイラは、コードが正しいこと、したがって警告を確認することができません。
なぜ書かないで
let (a', b', c') = ( f a, f b, f c);;
これは、これを書くためにそんなに多くの仕事ではないですが、コード内の任意の将来の変化に対して完全に安全ます。
所属していません StackOverflow