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