Haskell foldl 'pobre rendimiento con (++)

Tengo este codigo

import Data.List

newList_bad  lst = foldl' (\acc x -> acc ++ [x*2]) [] lst
newList_good lst = foldl' (\acc x -> x*2 : acc) [] lst

Estas funciones devuelven listas con cada elemento multiplicado por 2:

*Main> newList_bad [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> newList_good [1..10]
[20,18,16,14,12,10,8,6,4,2]

En ghci:

*Main> sum $ newList_bad [1..15000]
225015000
(5.24 secs, 4767099960 bytes)
*Main> sum $ newList_good [1..15000]
225015000
(0.03 secs, 3190716 bytes)

Por quénewList_bad función funciona 200 veces más lento quenewList_good? Entiendo que no es una buena solución para esa tarea. ¿Pero por qué este código inocente funciona tan lento?

¿Qué es este "4767099960 bytes"? Por eso tan simple una operación Haskell usó 4 GiB ??

Después de la compilación:

C:\1>ghc -O --make test.hs
C:\1>test.exe
225015000
Time for sum (newList_bad [1..15000]) is 4.445889s
225015000
Time for sum (newList_good [1..15000]) is 0.0025005s

Respuestas a la pregunta(3)

Su respuesta a la pregunta