gpt4 book ai didi

haskell - 多久评估一次扩展列表

转载 作者:行者123 更新时间:2023-12-02 21:30:42 25 4
gpt4 key购买 nike

是否从一开始就对 cumfib 的每个元素进行评估?

fib = (1:1: zipWith (+) fib (tail fib))
cumfib = [ sum $ take i fib | i<-[1..]]

或者前 i 个元素是否被缓存并重用于 cumsum 的元素 (i+1)?

我或多或少猜测 fib 在同一个 lambda 表达式中使用,因此只计算一次。

此外,fib 的实现对于评估第 i 个斐波那契数的频率是否重要?我的实际问题涉及素数而不是斐波那契数,我希望“缓存”斐波那契数以轻松评估某个数字 n 的素因数。不过我只用

takeWhile (\x-> x*x<n) primes 

素数。由于我首先评估小 n 的因子,然后评估较大 n 的因子,所以素数的这个子集会增加,因此我想知道,如果我这样做,素数的评估频率是多少:

primes = ... some way of calculating primes ...
helpHandlePrimes ... = ... using primes ...
handlePrimes = ... using primes and helpHandlePrimes ...

请告诉我素数是否计算一次、多次,或者是否无法根据我提出问题的方式来确定。

最佳答案

let-bound 术语通常在其范围内共享。特别是,模块中的顶级术语在整个程序中共享。但是,您必须小心该术语的类型。如果该术语是一个函数,那么共享意味着仅共享 lambda 抽象,因此该函数不会被内存。 重载术语在内部表示为函数,因此共享对于重载术语来说也是毫无意义的。

因此,如果您有一个单态数字列表,那么它将被共享。默认情况下,由于“单态限制”,您给出的诸如 fib 之类的列表将是单态的(实际上这是一个有用的情况)。然而,现在禁用单态限制很流行,所以无论如何我建议给出一个显式的类型签名,例如

fib :: [Integer]

确保并向每个人明确表示您希望这是一个单态列表。

关于haskell - 多久评估一次扩展列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22372314/

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