我试图找到所有小于某个整数的素数n
使用列表理解尽可能简洁。我正在学习 Haskell,这只是一个练习。我想写一些类似的东西:
isqrt :: Integral a => a -> a
isqrt = floor . sqrt . fromIntegral
primes :: Integral a => a -> [a]
primes n = [i | i <- [1,3..n], mod i k /= 0 | k <- primes (isqrt i)]
这当然行不通。有没有办法在列表理解中进行列表理解?
这是我收到的错误:
exercise-99-1.hs:138:39: Not in scope: `k'
exercise-99-1.hs:138:46:
Illegal parallel list comprehension: use -XParallelListComp
exercise-99-1.hs:138:68: Not in scope: `i'
但是 - 我真的没想到语法是合法的:-)
目的是尽可能直接地翻译:" primes n
= 奇数集合i
少于n
这样i
不能被任何整除k
, 对全部k
在集合中:primes (isqrt i)
"- 或多或少。 (我希望我猜对了?)
Thanks!
我在以下方面取得了一些进展:
primes :: Integral a => a -> [a]
primes 2 = [2]
primes n = 2:[i | i <- [3,5..n], all (\k -> if (mod i k /= 0) then True else False)
(primes (isqrt i))]
有没有更短的方法来编写 lambda 谓词?
edit:是的,有,感谢评论里的留言!
primes :: Integral a => a -> [a]
primes 2 = [2]
primes n = 2:[i | i <- [3,5..n], all ((/= 0) . mod i) (primes (isqrt i))]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)