Компилятор должен предупреждать вас, если вы пропустите второе предложение, т. Е. Если в вашем последнем совпадении есть набор охранников, где последнее не является тривиально истинным.
Как правило, проверка защиты на полноту, очевидноневозможно, так как это будет так же трудно, как решить проблему остановки.
Ответ на комментарий Мэтта:
Посмотрите на пример:
foo a b
| a <= b = True
| a > b = False
Человек может видетьчто один из обоих охранников должен быть правдой.Но компилятор не знает, что либо a <= b
, либо a > b
.
Теперь поищем другой пример:
fermat a b c n
| a^n + b^n /= c^n = ....
| n < 0 = undefined
| n < 3 = ....
Чтобы доказать, что набор охранников завершен, компилятору пришлось доказать последнюю теорему Ферма.Это невозможно сделать в компиляторе.Помните, что количество и сложность охранников не ограничены.Компилятор должен быть общим решением для математических задач, задач, которые изложены в самом Haskell.
Более формально, в простейшем случае:
f x | p x = y
, компилятор должен доказать, что еслиp x
не является нижним, тогда p x
является True
для всех возможных x.Другими словами, он должен доказать, что либо p x
является нижним (не останавливается), независимо от того, что x
является или оценивается как True
.