D. *_*nes 5 primes haskell list-comprehension 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]
Run Code Online (Sandbox Code Playgroud)
这是我的代码.我想你猜对了我要做的事情:使用无限素数列表给定数字的素数因子列表.但是这段代码不会懒惰地评估.
当我使用ghci和:l mycode.hs输入时primeFactors 24,结果是[2, 3(并且光标在那里不断闪烁)没有进一步的Prelude>提示.我认为那里有一个问题.我究竟做错了什么?
谢谢.
takeWhile永远不会终止复合参数.如果n是复合的,它没有素因子>= n,所以takeWhile只会坐在那里.
应用于takeWhile素数列表,然后使用n modx 过滤结果,如下所示:
primeFactors n = [x | x <- takeWhile (<= n) primes, n `mod` x == 0]
Run Code Online (Sandbox Code Playgroud)
(<=用于代替<最大正确性,因此素数的素因子将由该数字组成).