Я ввожу этот код в интерпретатор, и память быстро потребляется:
last [1..10^7] `seq` ()
Я не понимаю, почему для этого требуется больше, чем O (1). Если я делаю только (что должно быть одинаковым, потому что Show заставляет слабую головную нормальную форму, поэтому seq избыточно?):
last [1..10^7]
... он отлично работает.
Я не могу воспроизвести эту ситуацию за пределами интерпретатора.
Что здесь происходит?
Вот несколько тестовых примеров: http://hpaste.org/69234
Примечания:
- Запустив в интерпретаторе, я загружаю wtf.hs без его компиляции и набираю
wtf<n>
в ghci. - Скомпилируя, я делаю
ghc --make wtf.hs && ./wtf
. -
last
может быть заменен наsum
со строгим аккумулятором или функцией, которая находит максимальный элемент в списке, а утечка пространства все равно происходит - Я не видел этого поведения при использовании
$!
вместоseq
. - Я попытался добавить параметр dummy
()
, потому что я подумал, что это проблема CAF. Ничего не изменяет. - Вероятно, это не проблема с функциями на
Enum
, потому что я могу воспроизвести поведение с помощьюwtf5
и более поздних версий, которые вообще не используютEnum
. - Вероятно, это не проблема с
Num
,Int
илиInteger
, потому что я могу воспроизвести поведение без них вwtf14
иwtf16
.
Я попытался воспроизвести проблему с арифметикой Peano, чтобы взять списки и целые числа из уравнения (выборка в конце 10 ^ 9), но столкнулся с другими проблемами утечки памяти/пространства, которые я не понимаю при попытке реализовать *
.