Проблема с вашим average
.
average a = (sum a) `div` (length a)
sum
использует весь список. length
также использует весь список. Это означает, что весь список будет создан и сохранен в памяти, пока одна из этих функций не пройдет через него, и не будет собирать мусор, пока другая функция не пройдет его.
Вы передаете average
очень большой список, поэтому вам не хватит памяти.
Решение: переписать average
как функцию, которая обходит список только один раз, так что список можно собирать мусором при его создании.
Пример (не проверено):
average a = sum `div` length
where (sum, length) = foldl' f (0, 0) a
f (sum, length) i = (sum + i, length + 1)
Обратите внимание, что здесь используется foldl'
, начиная с Data.List
, а не foldl
. foldl
имеет свои собственные проблемы с космосом (которые кто-то более знающий, чем я, возможно, пожелает прокомментировать).
И, как указал Тобиас Вярре,
roundedSq n | (roundedSq n) == roundedSq (n-1) = n : roundedSq (n+1)
приведет к бесконечному циклу:
- мы хотим оценить
roundedSq n
- если
(roundedSq n) == roundedSq (n-1)
истинно, мы вернем n : roundedSq (n+1)
в качестве ответа
- нам нужно оценить
(roundedSq n) == roundedSq (n-1)
- нам нужно оценить
roundedSq n
- Перейти к 1.