Утечка пространства с избыточным использованием seq в интерпретаторе GHC

Я ввожу этот код в интерпретатор, и память быстро потребляется:

last [1..10^7] `seq` ()

Я не понимаю, почему для этого требуется больше O(1) места , Если я просто сделаю (что должно быть таким же, потому что Show вызывает слабую нормальную форму головы, поэтому seq является избыточным?):

last [1..10^7]

... это работает нормально

Я не могу воспроизвести эту ситуацию вне

Что здесь происходит?


Вот несколько тестовых примеров: http://hpaste.org/69234

На что обратить внимание:

  • Запустив интерпретатор, я загружаю wtf.hs без его компиляции и набираю wtfв гчи.
  • При компиляции я делаю ghc --make wtf.hs && ./wtf.
  • lastможно заменить на sumсо строгим аккумулятором или функцией, которая находит максимальный элемент в списке, и все равно происходит утечка пространства
  • Я не видел такого поведения при использовании $! вместо seq.
  • Я попытался добавить фиктивный параметр (), так как думал, что это проблема CAF. Ничего не меняет.
  • Вероятно, это не проблема с функциями в Enum, потому что я могу воспроизвести поведение с wtf5и более поздними версиями, которые вообще не используют Enum. .
  • Вероятно, это не проблема с Num, Intили Integer, потому что я могу воспроизвести поведение без них в wtf14и wtf16.

Я попытался воспроизвести проблему с арифметикой Пеано, чтобы убрать списки и целые числа из уравнения (извлечение в конце 10^9), но столкнулся с другими проблемами совместного использования/утечки пространства, которые я не понимаю, когда пытался реализовать *.

22
задан L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 30 May 2012 в 04:00
поделиться