Haskell 中的模块化算术
Posted
技术标签:
【中文标题】Haskell 中的模块化算术【英文标题】:Modular Arithmetic in Haskell 【发布时间】:2011-08-29 15:47:53 【问题描述】:我将如何创建一个函数,以便 x
具有从 x=0
到 x=19
的值范围,如果 x
值超过 19 或低于零,我怎样才能让它环绕
来自:
x=20, x=21, x=22
和 x=(-1), x=(-2), x=(-3)
到:
x=0, x=1, x=2
和 x=19, x=18, x=17
分别?
我听说过模算术,这显然是我应该处理的方式。
【问题讨论】:
【参考方案1】:通常你会使用内置函数mod
和rem
,但我认为它们是家庭作业的禁区。所以你可以编写自己的函数,例如
mod20 x | x < 0 = ...
| x > 19 = ...
| otherwise = x
您可以尝试在...
s 中填写不同的内容。最简单的方法之一是重复加减,但我不想破坏所有乐趣。
一旦你有了这个函数,你可以在每次“正常”算术运算之后“重新调整”值,例如mod20 (12 + 17)
.
【讨论】:
mod
和 rem
是完全一样的东西吗?他们似乎是。
mod
和 rem
在输入负数时表现不同;对于正数,它们是相同的。【参考方案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 中的模块化算术的主要内容,如果未能解决你的问题,请参考以下文章