Резонно спросить, могут ли функциональные языки программирования делать меньше GC, отслеживая использование. Хотя общая проблема того, могут ли некоторые данные быть безопасно отброшены, неразрешима (из-за условного ветвления), безусловно, возможно работать статически усерднее и находить больше возможностей для прямого освобождения.
Стоит обратить внимание на работу Мартина Хофманна и его команды по проекту «Гарантии мобильных ресурсов», который сделал выделение памяти типа (de / re) основной темой. Однако то, что заставляет их работать, - это то, чего Хаскелл не имеет в своей системе типов - линейность. Если вы знаете, что входные данные функции секрет из остальной части вычислений, вы можете перераспределить память, которую они занимают. Материал MRG особенно хорош, потому что он управляет реалистичным обменным курсом между освобождением для одного типа и распределением для другого, что превращается в старомодное старомодное манипулирование указателями под чисто функциональным внешним видом. Фактически, множество прекрасных алгоритмов скупой мутации (например, обратного обращения указателя, построения перезаписывающего хвостового указателя и т. Д.) Могут выглядеть чисто функциональными (и проверяться на наличие неприятных ошибок) с помощью этих методов.
По сути, линейная типизация ресурсов дает консервативное, но механически проверяемое приближение к виду анализа использования, который вполне может помочь уменьшить GC. Интересные вопросы включают то, как правильно смешать это лечение (осознанный выбор наречий) с обычным постоянным соглашением. Мне кажется, что довольно много промежуточных структур данных имеют начальную однопоточную фазу в рекурсивных вычислениях, перед тем как их разделяют или отбрасывают по окончании вычисления. Может быть возможно уменьшить мусор, генерируемый такими процессами.
TL; DR Есть хорошие типизированные подходы к анализу использования, которые сокращают GC, но у Haskell сейчас неправильная информация о типах, чтобы быть особенно полезной для этой цели.