Мне часто приходится сопоставлять кортежи значений, которые должны иметь один и тот же конструктор. Захват _,_
всегда заканчивается в конце. Это, конечно, хрупко, любой дополнительный конструктор, добавленный к типу, будет компилироваться отлично. Мои текущие мысли состоят в том, чтобы иметь совпадения, которые соединяют первый, но не второй аргумент. Но есть ли другие варианты?Предложение для решения хрупкого соответствия шаблонов
Например,
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? – 2010-12-03 15:32:19
Ну, я бы предпочел не иметь всех этих компиляционных предупреждений - дополнительный может затеряться в количестве сдвига, которое будет произведено. На самом деле я понятия не имел, что вы можете делать `или` соответствия внутри кортежей. Спасибо, спасибо. – nlucaroni 2010-12-03 15:33:36