当我在Ghci中查询
中缀运算符和div
div
运算符的类型时,我发现/
具有签名div
而(div) :: Integral a => a -> a -> a
具有签名/
。虽然他们完成了同样的事情,但类型类(/) Fractional a => a -> a -> a
和Fractional
之间有什么区别?
答案 0 :(得分: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
实例。