我有以下操作:
Prelude> mod (3 - 12) 7
Run Code Online (Sandbox Code Playgroud)
结果我有5个.
为什么结果是5?
当我尝试这样的事情时:
Prelude> mod -9 7
Run Code Online (Sandbox Code Playgroud)
然后我有错误:
<interactive>:6:1: error:
• Non type-variable argument
in the constraint: Num (t -> a -> a -> a)
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall a t.
(Num (t -> a -> a -> a), Num (a -> a -> a), Num t, Integral a) =>
a -> a -> a
Run Code Online (Sandbox Code Playgroud)
为什么?
我忘了提,我刚开始学习哈斯克尔.
整数模数,令人满意
Run Code Online (Sandbox Code Playgroud)(x `div` y)*y + (x `mod` y) == x
而div作为
整数除法被截断为负无穷大
你的情况x是-9和y是7.
-9/7是-1.2857 ......,(向下舍入)是-2.(-9) `div` 7就是这样-2.
看看上面的等式,我们得到了((-9) `div` 7)*7 + ((-9) `mod` 7) == (-9),这(-2)*7 + ((-9) `mod` 7) == (-9)反过来又简化为(-14) + ((-9) `mod` 7) == (-9),(-9) `mod` 7 == (-9) - (-14)最后(-9) `mod` 7 == 5(因为-9 + 14是5).
至于你的第二个问题:哈斯克尔解析mod -9 7为mod - (9 7),即走mod功能,从它应用的结果中减去9来7.这没有任何意义,因为9它不是一个函数(所以你不能应用它)并且mod不是一个数字(所以你不能从它中减去).1
修复是用来mod (-9) 7强制-解析为一元运算符(否定9)而不是二进制中缀运算符.
1正如错误消息提示,实际上有一种方法可以使ghc吞下这段代码.它涉及定义有趣的实例Num,但我不会在这里讨论.
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |