gpt4 book ai didi

Haskell 不评估 Lazily takeWhile

转载 作者:行者123 更新时间:2023-12-04 17:32:36 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com