Suggestion for solving fragile pattern matching <p>I often need to match a tuple of values that should have the same constructor. The catchall <code>_,_</code> always winds-up at the end. This of course is fragile, any additional constructor added to the type will compile perfectly fine. My current thoughts are to have matches that connect the first but not second argument. But, is there any other options?</p> <p>For example,</p> <pre><code>type data = | States of int array | Chars of (char list) array let median a b = match a,b with | States xs, States ys -&gt; assert( (Array.length xs) = (Array.length ys) ); States (Array.init (Array.length xs) (fun i -&gt; xs.(i) lor ys.(i))) | Chars xs, Chars ys -&gt; assert( (Array.length xs) = (Array.length ys) ); let union c1 c2 = (List.filter (fun x -&gt; not (List.mem x c2)) c1) @ c2 in Chars (Array.init (Array.length xs) (fun i -&gt; union xs.(i) ys.(i))) (* inconsistent pairs of matching *) | Chars _, _ | States _, _ -&gt; assert false </code></pre>