Почему GH C выполняет такой ленивый статический c анализ? - PullRequest
0 голосов
/ 02 августа 2020

GH C с радостью скомпилирует следующее:

signum :: Float -> Int
signum x
 | x > 0 = 1
 | x == 0 = 0

, не обращая внимания на другие необработанные случаи, и оставит их для выдачи исключений во время выполнения. TypeScript имеет лучший анализ статистики, чем этот. Какова причина этого?

1 Ответ

3 голосов
/ 02 августа 2020

Причина, по которой опубликованный вами фрагмент не генерирует приличного предупреждения, заключается в том, что 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 чисел, и если вы знаете, как его использовать, он может отловить все те же ошибки. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...