2016-05-30 3 views
0

Когда я запрашиваю тип div оператора инфиксных и / оператора в GHCI, я считаю, что div имеет подпись (div) :: Integral a => a -> a -> a пока / имеет подпись (/) Fractional a => a -> a -> a. В то время как они выполняют почти то же самое, в чем разница между типами классов Fractional и Integral?Типы классов Haskell - разница между div и /?

+3

они не делают то же самое вообще - 'div' является делением с остатком и'/'является ... дробным делением - думаю' 5/2 = 2.5' vs '' 5 'div' 2 = 2'' - видите ли вы разницу? - Разница между классами такова: «Интеграл» для чисел, которые вы можете делать с делением с остатком, а дробное - для рациональных чисел ('a/b') – Carsten

+0

Теперь я вижу .. Спасибо :-) –

+0

@ Carsten: Не могли бы вы опубликовать это как ответ для лучшей видимости? Благодаря! –

ответ

4

Существует концептуальная разница между этими операциями:

  • div является деление с остатком (см euclidean domain)
  • (/) является дробным делением - это обратной операция (*)

5/2 = 2.5 vs 5 `div` 2 = 2

Разница между классов только что

  • Integral для чисел, которые можно сделать деление с остатком с
  • и Fractional для рационального как чисел в виде a/b - думать о 1/2 или 2/7 и т.д.

Действительно, это общая проблема, если смешать оба Fractional и Integral операции типа div и (/) как только в пределах прелюдии нет типа, который является экземпляром обоих этих классов, и поэтому вы получите хорошо типизированное выражение, которое вы часто не можете оценить.

Обычная затруднительное для этого используется fromIntegral идти преобразовать в общую Num например, вы ориентируетесь.

Смежные вопросы