同じコンストラクタを持つ値のタプルを照合する必要があることがよくあります。キャッチオール_,_
は常に最後に巻き上げられます。これはもちろん壊れやすく、型に追加された追加のコンストラクタは完全にコンパイルされます。私の現在の考えは、第一引数ではなく第二引数を結ぶマッチを持つことです。しかし、他の選択肢はありますか?例えば脆弱なパターンマッチングを解決するための提案
、
type data = | States of int array
| Chars of (char list) array
let median a b = match a,b with
| States xs, States ys ->
assert((Array.length xs) = (Array.length ys));
States (Array.init (Array.length xs) (fun i -> xs.(i) lor ys.(i)))
| Chars xs, Chars ys ->
assert((Array.length xs) = (Array.length ys));
let union c1 c2 = (List.filter (fun x -> not (List.mem x c2)) c1) @ c2 in
Chars (Array.init (Array.length xs) (fun i -> union xs.(i) ys.(i)))
(* inconsistent pairs of matching *)
| Chars _, _
| States _, _ -> assert false
興味深い!この戦略はおそらく、Haskell IDEに組み込むべきものでしょうか? –
まあ、私はむしろそれらのコンパイルの警告をすべて持っていないだろう - 追加のものが生産されるせん断数で失われるだろう。私は実際にあなたがそのようなタプルの中で 'または'マッチをすることができるのかどうか分からなかった。それはいくつかの行を保存するはずです、ありがとう。 – nlucaroni
@nlucaroniもし私がそれを明確にしていない場合は、コードにコピー・ペースト・バックするためのキャッチオールの壊れにくいパターンが含まれているため、一時的に警告を出すことを提案しています。 –