¿Se puede duplicar un procesador para mejorar el rendimiento de la memoria?

Uno de mis problemas con la evaluación perezosa en Haskell es la dificultad de razonar sobre el uso de la memoria. Creo que la capacidad de duplicar un procesador me haría esto mucho más fácil. Aquí hay un ejemplo.

Vamos a crear una lista realmente grande:

let xs = [1..10000000]

Ahora, vamos a crear una mala función:

bad = do
    print $ foldl1' (+) xs
    print $ length xs

Sin optimizaciones, esto consume unas pocas docenas de MB de RAM. El recolector de basura no puede desasignar xs durante el pliegue porque será necesario para calcular la longitud más adelante.

¿Es posible volver a implementar esta función algo como esto:

good = do
    (xs1,xs2) <- copyThunk xs
    print $ foldl1' (+) xs1
    print $ length xs2

Ahora, xs1 y xs2 representarían el mismo valor, pero también serían independientes entre sí en la memoria, por lo que el recolector de basura puede desasignarse durante el pliegue, lo que evita el desperdicio de memoria. (Aunque creo que esto aumentaría ligeramente el costo computacional?)

Obviamente, en este ejemplo trivial, refactorizar el código podría resolver fácilmente este problema, pero parece que no siempre es obvio cómo refactorizar. O a veces la refactorización reduciría enormemente la claridad del código.

Respuestas a la pregunta(3)

Su respuesta a la pregunta