En un lenguaje puro como Haskell, todos los datos son inmutables y ninguna estructura de datos existente se puede cambiar de ninguna manera.
En realidad, eso no es generalmente cierto. Los lenguajes puros utilizan una evaluación no estricta (perezosa), por lo que se aplaza la evaluación de potencialmente todas las subexpresiones. Las expresiones no evaluadas generalmente se asignan en montón como un "thunk". Cuando se requiere, se evalúa la expresión y se muta el thunk en el valor resultante.
¿Qué estrategias y técnicas emplean los recolectores de basura frente a la pureza que de otro modo no harían?
Lo único en lo que puedo pensar es en los agujeros negros . No recuerdo haber visto nada más nuevo en el lado de GC en los documentos de investigación de Haskell.
¿Qué funciona muy bien en un GC de lenguaje impuro que no lo hace en un contexto puro?
La barrera de escritura GC. Los idiomas impuros tienden a escribir punteros en el montón mucho más, por lo que tienden a tener sus barreras de escritura más optimizadas.
Otros algoritmos de GC como mark-region son mucho más viables en el contexto de lenguajes impuros porque pueden tener tasas de asignación mucho más bajas que los lenguajes puros.
¿Qué otros problemas nuevos crean los lenguajes puros para los GC?
Los lenguajes puros son muy raros, por lo que hay muchos menos datos sobre cómo los programas puros usan la memoria y, por lo tanto, está empezando en una posición peor cuando intenta escribir un GC para un lenguaje puro.