Причина, по которой опубликованный вами фрагмент не генерирует приличного предупреждения, заключается в том, что GH C должен будет использовать функции ==
и >
в особом случае для этого. Для GH C это просто функции типа Float -> Float -> Bool
, без информации о покрытии своего домена. Средство проверки полноты, которому удалось обнаружить ошибку в вашем коде, должно быть подключено к уже довольно сложной программе проверки полноты GH C (с которой он будет взаимодействовать сложным образом) только для этих двух функций.
В Haskell мы стараемся не писать подобный код. Чтобы выполнить sh ту же задачу, вы должны написать следующее:
signum :: Float -> Int
signum x = case compare x 0 of
GT -> 1
EQ -> 0
Это уменьшает количество сравнений, которые вы должны сделать, и действительно даст предупреждение для вашего отсутствующего случая (с -Wall
). Вам нужно добавить:
signum :: Float -> Int
signum x = case compare x 0 of
GT -> 1
EQ -> 0
LT -> -1
Этот вид исчерпывающей проверки является гораздо более универсальным и мощным, чем просто отлов некоторых сравнений c чисел, и если вы знаете, как его использовать, он может отловить все те же ошибки. .