【发布时间】:2018-12-06 03:39:07
【问题描述】:
我发现很难理解 Haskell 将如何评估这个 primes 函数。 primes 函数是否被反复评估,或者primeFactors 函数中的primes 将指向第一个primes?
primes = 2 : filter ((==1) . length . primeFactors) [3,5..]
primeFactors n = factor n primes
where
factor n (p:ps)
| p * p > n = [n]
| n `mod` p == 0 = p : factor (n `div` p) (p:ps)
| otherwise = factor n ps
main :: IO ()
main = print $ length . take 100000 $ primes
【问题讨论】:
-
primes根本不是函数;这只是一个列表。 -
谢谢。所以在幕后,现在每次调用 primeFactors 时,
primes都与我们上次调用 primeFactors 时不同。这是partially evaluating? -
@dandoh
primes永远不会改变,就像 Haskell 中的所有值一样。primes只是自我引用——它就像无限列表x = 1 : x,它是1s 的无限列表。 -
离题了,但是检查一个非空列表是否只有一个元素可以用
null . tail而不是(== 1) . length来完成。这样primeFactors将在找到第二个因子后停止计算因子,而不是计算所有因子。请注意,这不适用于空列表(此处不是这种情况)。 -
这样的定义被称为constant applicative forms
标签: haskell lazy-evaluation weak-head-normal-form