寻找素数的Haskell列表理解

寻找素数的Haskell列表理解,haskell,syntax,syntax-error,list-comprehension,primes,Haskell,Syntax,Syntax Error,List Comprehension,Primes,我试图使用列表理解,尽可能简洁地找到小于某个整数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

我试图使用列表理解,尽可能简洁地找到小于某个整数
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)]
但是-我真的不希望语法是合法的:-)

其目的是尽可能直接地翻译:“
primes n
=奇整数集
i
小于
n
,使得
i
不可被任何
k
整除,对于集合中的所有
k
primes(isqrt i)
”-或多或少。(我希望我没弄错?)


谢谢

我在以下方面取得了一些进展:

primes::积分a=>a->[a]
素数2=[2]
素数n=2:[i | i如果(mod ik/=0)那么为真,否则为假)
(素数(isqrt i))]
有没有一种更短的方法来编写lambda谓词

编辑:是的,有,感谢评论中的评论

primes::积分a=>a->[a]
素数2=[2]
素数n=2:[i | i你的代码

primes n = [i | i <- [1,3..n], mod i k /= 0 
              | k <- primes (isqrt i)]

最佳试验划分通常在~n1.4..1.45处运行,基于列表的埃拉托斯烯筛在~n1.2..1.25处运行,如果在可变阵列上优化实施,则在~n1.0..1.1处运行(产生的素数为n,而不是上限).

不起作用是非常没有帮助的。发布错误。你能把这个错误放到你的帖子正文中吗?谢谢。这里有一个:-试用除法和一种Eratosthenes筛选法。永远不要说
if…then True else False
。只需说
部分:
\k->mod i k/=0
,你也可以让它无意义,如果这是你的事情:
(/=0.mod i)
更清楚的是定义一个单独的函数:
可除i=(==0.mod i
,然后用
(not.divisible i)
代替lambda函数,为什么从不说“if…then True else False”?@Frank:因为条件表达式的计算结果已经是
True
False
if
语句是完全冗余的,会把事情弄得一团糟。
primes n = [i | i <- [1,3..n], mod i k /= 0 
              | k <- primes (isqrt i)]
primes n = [i | (i,k) <- zip [i | i <- [1,3..n], mod i k /= 0]
                                    -- not in scope: k ^
                             [k | k <- primes (isqrt i)] ]
                                  -- not in scope: i ^
primes 1 = []
primes n = 2:[i | i <- [3,5..n], and [mod i k /= 0 | k <- primes (isqrt i)]]
 > length $ primes 10000     -- => 1229    (0.50 secs)

 > length $ primes 20000     -- => 2262    (1.40 secs)

 > logBase (2262/1229) (1.4/0.5)      -- => 1.6878      ~ n^1.69

 > length $ primes 40000     -- => 4203    (4.07 secs)

 > logBase (4203/2262) (4.07/1.4)     -- => 1.7225      ~ n^1.72