Вот простая программа, которая ударяет мою кучу в Kingdom Come:
intersect n k z s rs c
| c == 23 = rs
| x == y = intersect (n+1) (k+1) (z+1) (z+s) (f : rs) (c+1)
| x < y = intersect (n+1) k (z+1) s rs c
| otherwise = intersect n (k+1) z s rs c
where x = (2*n*n) + 4 * n
y = (k * k + k )
f = (z, (x `div` 2), (z+s))
p = intersect 1 1 1 0 [] 0
main = do
putStr (show p)
Что делает программа, так это вычисление пересечения двух бесконечных рядов, останавливаясь при достижении 23 элементов. Но это не важно для меня.
Интересно, что, насколько я могу судить, здесь не должно быть много места, сидящего на куче. Функция пересекается с рекурсией со всеми рекурсиями, записанными как хвостовые вызовы. Государство накапливается в аргументах, и его не так много. 5 целых чисел и небольшой список кортежей.
Если бы я был игроком на пари, я бы поспорил, что в аргументах, как я делаю рекурсию, создаются какие-то трюки, особенно по аргументам, которые не оцениваются по заданной рекурсии. Но это просто дикая догадка.
Какая истинная проблема здесь? И как это исправить?