Я использую проект Euler, чтобы научить себя Haskell, и у меня возникли некоторые затруднения, рассуждая о том, как мой код выполняется Haskell. Вторая проблема состоит в том, что я вычисляю сумму всех четных чисел Фибоначчи до 4 миллионов. Мой скрипт выглядит так:
fibs :: [Integer]
fibs = 1 : 2 : [ a+b | (a,b) <- zip fibs (tail fibs)]
evens :: Integer -> Integer -> Integer
evens x sum | (even x) = x + sum
| otherwise = sum
main = do
print (foldr evens 0 (take 4000000 fibs))
Hugs выдает ошибку «Сборщик мусора не может освободить достаточно места», что, как я полагаю, означает, что записи списка не освобождаются, поскольку они используются foldr
.
Что мне нужно сделать, чтобы это исправить? Я пытался написать хвостовую рекурсивную (я думаю) версию, в которой использовались аккумуляторы, но также не смог заставить ее работать.