Haskell mod如何计算

Haskell mod如何计算,haskell,Haskell,我做了以下手术: Prelude> mod (3 - 12) 7 结果我得了5分 为什么结果是5 当我尝试这样的事情时: Prelude> mod -9 7 然后我得到了一个错误: <interactive>:6:1: error: • Non type-variable argument in the constraint: Num (t -> a -> a -> a) (Use FlexibleContexts

我做了以下手术:

Prelude> mod (3 - 12) 7
结果我得了5分

为什么结果是5

当我尝试这样的事情时:

Prelude> mod -9 7
然后我得到了一个错误:

<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
:6:1:错误:
•非类型变量参数
在约束中:Num(t->a->a->a)
(使用flexibleContext允许此操作)
•检查推断类型时
这是所有的一个t。
(Num(t->a->a->a),Num(a->a->a),Num t,积分a)=>
a->a->a
为什么?

我忘了提一下,我刚开始学习哈斯克尔。

整数模,满意

(x `div` y)*y + (x `mod` y) == x
(x `div` y)*y + (x `mod` y) == x
div
as

整数除法向负无穷大截断

在您的情况下,
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)
,最后是
至于你的第二个问题:Haskell将
mod-97
解析为
mod-(97)
,即取
mod
函数并从中减去将
9
应用于
7
的结果。这毫无意义,因为
9
不是函数(因此无法应用它),而
mod
不是数字(因此无法从中减去)。1

解决方法是使用
mod(-9)7
强制将
-
解析为一元运算符(否定
9
),而不是二进制中缀运算符

1正如错误消息所提示的,实际上有一种方法可以让ghc吞下这段代码。它涉及到定义
Num
的有趣实例,但我在这里不详细介绍

整数模,满意

(x `div` y)*y + (x `mod` y) == x
(x `div` y)*y + (x `mod` y) == x
div
as

整数除法向负无穷大截断

在您的情况下,
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)
,最后是
至于你的第二个问题:Haskell将
mod-97
解析为
mod-(97)
,即取
mod
函数并从中减去将
9
应用于
7
的结果。这毫无意义,因为
9
不是函数(因此无法应用它),而
mod
不是数字(因此无法从中减去)。1

解决方法是使用
mod(-9)7
强制将
-
解析为一元运算符(否定
9
),而不是二进制中缀运算符


1正如错误消息所提示的,实际上有一种方法可以让ghc吞下这段代码。它涉及到定义
Num
的有趣实例,但我在此不赘述。

首先,正如注释中已经指定的那样,如果您编写
-9
时没有括号,它将被解释为一个函数,而不是一个负数

现在来看
mod
部分:()和余数()之间有区别:


因此,如果分子和分母都是正的,就没有区别,因为
quot
(除法被截断为零)和
div
(落地除法)是等价的

但是,当分子为负时,
mod
仍将为正,因为
div
已铺底,且该(
(div x y)*y
)将低于或等于实际结果。而
rem
将为负值

另一方面,如果分母为负,则结果
mod
将为负,而
rem
将再次取决于分子符号的符号


因此,
mod
总是取分母的符号,而对于
rem
它取决于分子的符号。

首先,正如注释中已经指定的,如果你写的
-9
没有括号,它被解释为一个函数,而不是一个负数

现在来看
mod
部分:()和余数()之间有区别:


因此,如果分子和分母都是正的,就没有区别,因为
quot
(除法被截断为零)和
div
(落地除法)是等价的

但是,当分子为负时,
mod
仍将为正,因为
div
已铺底,且该(
(div x y)*y
)将低于或等于实际结果。而
rem
将为负值

另一方面,如果分母为负,则结果
mod
将为负,而
rem
将再次取决于分子符号的符号


因此,
mod
总是取分母的符号,而
rem
则取决于分子的符号。

我想你期望的是-2。模的数学定义是一个自然数(>=0),因此它必须返回5(-2+7),而不是-5

如果你想要一个返回-2的函数(就像大多数语言一样),你可以使用
rem
函数
(x `quot` y)*y + (x `rem` y) == x