Оценивается ли fib с самого начала для каждого элемента cumfib?
fib = (1:1: zipWith (+) fib (tail fib))
cumfib = [ sum $ take i fib | i<-[1..]]
Или первые элементы i кэшируются и повторно используются для элемента (i + 1) cumsum?
Я более или менее предполагаю, что fib используется в одном и том же лямбда-выражении и, следовательно, вычисляется только один раз.
Кроме того, имеет ли значение реализация 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 ...
Пожалуйста, дайте мне знать, оцениваются ли простые числа один раз, несколько раз или это нельзя определить по тому, как я сформулировал вопрос.
fib
. Это значение высшего уровня? Или просто пусть связанная переменная в какой-то функции? - person Ingo   schedule 13.03.2014