haskell - 迭代列表来检测素数

标签 haskell primes

我在 Haskell 中得到了一份作业,其中我应该编写一个模块,该模块有助于从列表中检测素数,例如:

[2,3,4,5,6,7,8,9,10]

对于家庭作业,我应该迭代这个列表中的每个元素,并消除它的所有倍数。例如,我选择数字 2,我应该消除 4、6、8、10。然后转到数字 3 并删除 6 和 9,依此类推,直到最后,返回仅包含质数的列表。

我有一个使用函数 map 的想法,但我被困在这个地方(尽管我对 Haskell 还很陌生)

是的,这是我的作业,但是不,我不必做,这只是练习。所以我很感谢您的帮助。

最佳答案

您可以推出自己的函数,而不是使用map(我认为如果不进行一些预处理这是不可能的):

sieveWith _  [] = []
sieveWith ss (x:xs) | any ((==) 0 . mod x) ss = sieveWith ss xs
                    | otherwise = x : (sieveWith (x:ss) xs)

和:

sieve = sieveWith []

现在如果你调用sieve:

*Main> sieve [2,3,4,5,6,7,8,9,10]
[2,3,5,7]

该函数使用通过函数调用传递的变量(第一个),并且每次选择一个值并将其添加到列表中。如果变量列表上没有模运算产生零(第二个保护),则选择一个值。万一any mod的ulo 的结果为零,该值被简单地省略。

关于haskell - 迭代列表来检测素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36960534/

相关文章:

haskell - 短==实现

haskell - 如何实现一个最优的、纯功能性的、双端优先级队列?

haskell - 堆栈如何解决依赖关系?

python - 试图制作一个简单的质数检查器,不会让我使用平方根。 Python 3.2

python - 创建包含前 100 个素数的列表时出现无尽错误

c# - 将在文件中查找素数的算法的结果存储 (C#)

haskell - Haskell 是否有类似于后期绑定(bind)的东西(或者,我们可以更改正在进行的 Haskell 程序的功能定义)吗?

haskell - Haskell monad 不强制执行的分类单子(monad)的身份是什么?

c - 判断一个数是否为素数的程序

performance - 在 Haskell 中,看似优化的素性检查更改结果是悲观化