Почему операции Enum завершаются неудачно, если в GHCi не указан тип? - PullRequest
0 голосов
/ 27 августа 2018

Например, я ожидаю, что следующее будет просто использовать тип по умолчанию, однако:

 succ mempty
*** Exception: Prelude.Enum.().succ: bad argument
 succ minBound
*** Exception: Prelude.Enum.().succ: bad argument
 :t succ mempty
succ mempty :: (Monoid a, Enum a) => a
 :t succ minBound
succ minBound :: (Bounded a, Enum a) => a

Я бы ожидал, что (Bounded a, Enum a) => a как минимум совпадет с Int.

1 Ответ

0 голосов
/ 27 августа 2018

Он «просто использует тип по умолчанию», именно поэтому вы получаете такое поведение!

А именно, по умолчанию всегда используется простой st тип, который соответствуетограничение .

  • Когда вы выполняете дробную арифметику, вам необходимо Double.
  • Когда вы выполняете любую другую арифметикуцелочисленный тип также делает свое дело;Выбран Integer, который прост в том смысле, что не имеет границ.
  • Там, где нет арифметики, вам не нужен тип Num.Часто () достаточно для выполнения ограничений.Конечно, этого может быть недостаточно для выполнения семантики , которую вы намереваетесь, но это в основном означает, что выведенная подпись является более общей, чем та, которую вы хотели бы.

Что янемного удивляет то, что GHCi не будет использовать значения по умолчанию от (Num a, Bounded a, Enum a) => a до Int, но откажется от поиска значения по умолчанию для a.

Я вообще вообще не полагаюсь на дефолт.Хорошее практическое правило - не делать аргументы функции более полиморфными, чем результат (чтобы типы аргументов всегда можно было вывести из контекста), а затем при необходимости просто добавьте аннотацию одного типа кконец выражения в REPL.Конечно, это также работает и здесь:

Prelude> succ minBound :: Int
-9223372036854775807

Возможно, было бы больше в соответствии с философией, если бы тип Fractional по умолчанию был Rational.

Если, конечно, у вас нет особой причины.Функции преобразования, возможно, должны быть независимо полиморфными в аргументе и результате, но они обычно нужны только тогда, когда вокруг уже есть слишком много информации типа , что вызывает противоречие.

...