Haskell 不评估 Lazily takeWhile

标签 haskell list-comprehension primes lazy-evaluation prime-factoring

isqrt :: Integer -> Integer
isqrt = floor . sqrt . fromIntegral

primes :: [Integer]
primes = sieve [2..] where
 sieve (p:ps) = p : sieve [x | x <- ps, x `mod` p > 0]

primeFactors :: Integer -> [Integer]
primeFactors n = takeWhile (< n) [x | x <- primes, n `mod` x == 0]

这是我的代码。我想你猜到了我想要做什么:使用无限质数列表的给定数字的质因数列表。但是这段代码不会懒惰地评估。

当我使用 ghci:l mycode.hs然后输入 primeFactors 24 ,结果是 [2, 3 (并且光标在那里不断闪烁)没有进一步的 Prelude>迅速的。我认为那里有问题。我究竟做错了什么?

谢谢。

最佳答案

takeWhile永远不会因复合参数而终止。如 n是合数,它没有质因数 >= n , 所以 takeWhile只会坐在那里。

申请 takeWhile到素数列表,然后用 n mod 过滤结果x,像这样:

primeFactors n = [x | x <- takeWhile (<= n) primes, n `mod` x == 0]

( <= 用于代替 < 以获得最大的正确性,以便质数的质因数由该数字组成)。

关于Haskell 不评估 Lazily takeWhile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38827147/

相关文章:

haskell - 在 Haskell 中建模领域数据

Python - 如果源是文件,则 Sum 在列表理解语法中不起作用

python列表理解解压缩多个返回

haskell - GHC 7.0.4 似乎忘记了如何应用仿函数

haskell - OCaml 中的反向状态单子(monad)

haskell - 为数据构造函数提供列表中的元素

python - 如何在 Python 中以级联格式(在 for 循环中)迭代未知长度的列表?

algorithm - 判断一个数是否为素数的好算法?

python - 获取随机数列表中的第一个素数

c++ - 在 hackerearth 中获取 TLE