Я не понимаю, как компиляторы FP делают код, работающий с неизменяемыми структурами данных, быстрым, не разрушенным стеком и т. Д.
Например, операция вставки в дерево, она должна скопировать все дерево перед добавлением нового узла и вернуть скопированное дерево, в отличие от императивного couterpart, которому нужно только добавить указатель на новый узел. Если операция вставки выполняется миллионы раз, это потребует загрузки памяти, и копирование будет выполняться медленнее и медленнее, когда дерево будет больше. Как компиляторы FP действительно оптимизируют это?