Как вы определяете, является ли данный шаблон "хорошим", в частности, является ли он исчерпывающим и неперекрывающимся, для языков программирования в стиле ML?
Предположим, что у вас есть такие шаблоны, как:
match lst with
x :: y :: [] -> ...
[] -> ...
или
match lst with
x :: xs -> ...
x :: [] -> ...
[] -> ...
Хорошая проверка типа предупреждает, что первая не является исчерпывающей, а вторая перекрывается. Как бы тип проверки мог принимать такие решения в общем случае для произвольных типов данных?