Была ли какая-либо работа по поддержке общей утилизации в Хаскеле?
Была ли какая-либо работа по поддержке переработки в векторном стиле для общих данных в 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 МБ. Не настолько экстремально, но это все же немного памяти, которую, теоретически, можно сохранить.