Я использую проект 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
.
Что мне нужно сделать, чтобы исправить это? Я попытался написать версию с хвостовой рекурсией (я думаю), которая использовала аккумуляторы, но тоже не смогла заставить ее работать.