Была ли какая-либо работа по поддержке общей утилизации в Хаскеле?

Была ли какая-либо работа по поддержке переработки в векторном стиле для общих данных в Haskell? Например бег

main = do
  let ls = [1..1000000]
  print ls

с -p заявляет, что выделяет в общей сложности 425мб. Бег

main = do
  let ls = [1..1000000]
  print ls
  print (ls ++ [1])

с -p заявляет, что выделяет в два раза больше, на 820mb.

Я понимаю, почему это происходит, но мне интересно, почему GHC не выполняет эту оптимизацию. Я полагаю, что одна из причин заключается в том, что в реальном коде он не так уж много показывает, поэтому преимущества незначительны, если вообще что-то есть (но, может быть, общий способ переработки любой индуктивной структуры может принести некоторую пользу?) Обычно людям в любом случае говорят использовать другие структуры данных (например, Data.Seq).

ps - я видел ссылки на 'Recycle Your Arrays!' статья Романа Лещинского, однако все ссылки в Интернете теперь мертвы (и я не хочу платить за чтение через Springer)

редактировать:

Когда я использую deepseq вместо print, я получаю похожие, но менее экстремальные результаты. Без приложения я получаю 80 МБ, а с приложением 136 МБ. Не настолько экстремально, но это все же немного памяти, которую, теоретически, можно сохранить.

0 ответов

Другие вопросы по тегам