Haskell 中的模块化算术

Posted

技术标签:

【中文标题】Haskell 中的模块化算术【英文标题】:Modular Arithmetic in Haskell 【发布时间】:2011-08-29 15:47:53 【问题描述】:

我将如何创建一个函数,以便 x 具有从 x=0x=19 的值范围,如果 x 值超过 19 或低于零,我怎样才能让它环绕

来自: x=20, x=21, x=22x=(-1), x=(-2), x=(-3)

到: x=0, x=1, x=2x=19, x=18, x=17 分别

我听说过模算术,这显然是我应该处理的方式。

【问题讨论】:

【参考方案1】:

通常你会使用内置函数modrem,但我认为它们是家庭作业的禁区。所以你可以编写自己的函数,例如

mod20 x | x < 0 = ...
        | x > 19 = ...
        | otherwise = x

您可以尝试在...s 中填写不同的内容。最简单的方法之一是重复加减,但我不想破坏所有乐趣。

一旦你有了这个函数,你可以在每次“正常”算术运算之后“重新调整”值,例如mod20 (12 + 17).

【讨论】:

modrem 是完全一样的东西吗?他们似乎是。 modrem 在输入负数时表现不同;对于正数,它们是相同的。【参考方案2】:

尝试使用 mod 功能:

(-5) `mod` 20 ==> 15
5 `mod` 20 ==> 5
20 `mod` 20 ==> 0
25 `mod` 20 ==> 5

有关该主题,另请参阅 wikipedia。

【讨论】:

mod (-5) 20 = 15, rem (-5) 20 = 5 25 mod 25 不等于 5【参考方案3】:

使用

x `mod` 20

(这是使答案变成 30 个字符的填充物。)

【讨论】:

以上是关于Haskell 中的模块化算术的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 算术运算和任意/固定精度数的 DB 持久性

Haskell 中的模块、包和库有啥区别?

Haskell中的模块化算法

有没有办法使用 Template Haskell 枚举模块中的所有函数?

Haskell 导入模块

Haskell - 解决循环模块依赖