В качестве примера того, почему это может быть проблемой, рассмотрим, что произойдет, если expr
зависит от r
или c
, а соответствующий объект соответствует типу Const2
:
let c2 = Const2(1,2) in
match c2 with
...
| Const1 (r,c) | Const2 (m,n) -> r + 1
Поскольку c2
относится к типу Const2
, r
не определен справа от ->
, поэтому OCaml не знает, как вычислять r+1
.Компилятор ловит, что это произойдет, и заставляет вас изменить свой код, чтобы избежать этого.
Я предполагаю, что expr
не зависит от того, имеет ли тип ввода Const1
или Const2
(в противном случае вы бы поместили эти случаи в отдельные строки с разными выражениями), так что вы можете обойтись без
match ... with
...
| Const1 _ | Const2 _ -> expr
Если вам нужно сопоставить в каком-то поле, что Const1
и Const2
обаесть, см. ответ пэда.