这段代码
(4 :: Integer) / 2
Run Code Online (Sandbox Code Playgroud)
会导致错误:
No instance for (Fractional Integer) arising from a use of ‘/’
In the expression: (4 :: Integer) / 2
In an equation for ‘it’: it = (4 :: Integer) / 2
Run Code Online (Sandbox Code Playgroud)
为什么?
我需要指明
fromIntegral(4 :: Integer) / 2
Run Code Online (Sandbox Code Playgroud)
得到一个结果.但是如果我需要一个实数而不是2.0呢?
因为整数的除法运算符有两个结果(商和余数):
divMod :: Integer -> Integer -> (Integer, Integer)
Run Code Online (Sandbox Code Playgroud)
您还可以使用div运算符:
n `div` m
Run Code Online (Sandbox Code Playgroud)
它仅返回除法结果的一个组成部分(商),但这与 不同n / m。 /适用于除法运算符只有一个结果的类型,该结果将“商”和“余数”组合成一个分数。
等式地,如果(q, r) = n `divMod` m,那么
n = m * q + r
Run Code Online (Sandbox Code Playgroud)
而如果q = x / y, 那么
x = y * q
Run Code Online (Sandbox Code Playgroud)
(关于浮点数和近似值的常见警告)。
替换div会/破坏这种关系,因为它会丢弃一些您需要重现的信息n。