Tenía curiosidad acerca de algunos detalles de implementación exactos de las listas en Haskell (las respuestas específicas de GHC son buenas): ¿son listas vinculadas ingenuas o tienen alguna optimización especial? Más específicamente:¿Cómo se implementan las listas en Haskell (GHC)?
- hacer
length
y(!!)
(por ejemplo) tienen que recorrer la lista? - Si es así, ¿se almacenan en caché sus valores de alguna manera (es decir, si llamo a
length
dos veces, tendrá que iterar ambas veces)? - ¿El acceso a la parte posterior de la lista implica iterar a través de toda la lista?
- ¿Se han memorado las listas infinitas y las listas de comprensión? (Es decir, por
fib = 1:1:zipWith (+) fib (tail fib)
, cada valor se calculará recurrentemente, o va a depender del valor calculado anterior?)
Cualquier otro detalle de implementación interesante sería muy apreciado. ¡Gracias por adelantado!
Haskell también tiene [arrays] (https://wiki.haskell.org/Arrays) y ["matrices mutables"] (https://hackage.haskell.org/package/array-0.5.1.0/docs/Data-Array-ST.html). – osa