我在 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/