Я думаю, что обычный способ справиться с этим - сначала написать предложение, которое явно исключает случаи, которые вам не нужны.Затем вы можете использовать _
для обработки всех оставшихся случаев (вам нужно написать некоторый код для случая, который вы хотите исключить, но его необходимо написать в любом случае, чтобы завершить сопоставление с образцом):
match x with
| Y _ :: tail -> ()
| _ :: tail -> // List.head(x) is definitely not a Y
Это определенно похоже на обходной путь, но я боюсь, что это лучшее, что вы можете сделать.Если вы хотите исключить несколько случаев, вы можете написать что-то вроде:
match x with
| (Y _ | (Z (1 | 2 | 3 | 4)) :: tail -> ()
| _ :: tail -> // Excludes all "Y x" and "Z n when n \in 1,2,3,4"
В любом случае, это очень интересный вопрос - мне интересно, можно ли расширить язык шаблонов с помощью какого-либо специального шаблона для выраженияотрицание ... Интересно, что это не то, что может быть написано напрямую с использованием активных шаблонов.