list optimization compiler-construction haskell

list - ¿Qué es la corriente de fusión de Haskell?



optimization compiler-construction (3)

¿Qué es Stream Fusion de Haskell y cómo lo uso?


¿No es correcto, que cuando GHC en 6.12 usa esas nuevas funciones por defecto, que también implementarán [x..y] y enumerarán las comprensiones de esa manera no recursiva? Debido a que la única razón por la que no están en la fila correcta, es que son internos y no están escritos realmente en Haskell, sino más como palabras clave, por el bien de la velocidad y / o porque no podrías redefinir esa sintaxis.


El documento que señala Logan es genial, pero es un poco difícil. (Solo pregúntale a mis alumnos.) También es una gran oferta sobre ''cómo funciona la fusión de secuencias'' y solo una fracción ''de qué es la fusión de secuencias y cómo puedes usarla''.

El problema que la fusión de flujos resuelve es que los códigos funcionales tal como se escriben a menudo asignan listas intermedias, por ejemplo, para crear una lista infinita de números de nodos, puede escribir

nodenames = map ("n"++) $ map show [1..]

El código ingenuo asignaría una lista infinita de enteros [1, 2, 3, ...] , una lista infinita de cadenas ["1", "2", "3", ...] , y finalmente una lista infinita de nombres ["n1", "n2", "n3", ...] . Eso es demasiada asignación.

Lo que hace stream fusión es traducir una definición como nodenames a algo que usa una función recursiva que asigna solo lo que se necesita para el resultado. En general, eliminar la asignación de listas intermedias se denomina deforestación .

Para utilizar la fusión de secuencias, necesita escribir funciones de lista no recursiva que utilicen las funciones de la biblioteca de fusión de secuencias descrita en el ticket 915 de GHC ( map , foldr , etc.) en lugar de la recursión explícita. Esta biblioteca contiene nuevas versiones de todas las funciones de Preludio que se han reescrito para aprovechar la fusión de secuencias. Aparentemente, esto está programado para llegar a la próxima versión de GHC (6.12) pero no está en la versión estable actual (6.10). Si desea usar la biblioteca, Porges tiene una explicación simple y agradable en su respuesta.

Si realmente quiere una explicación de cómo funciona la fusión de secuencias, publique otra pregunta --- pero eso es mucho más difícil.


Por lo que yo sé, y al contrario de lo que dijo Norman, la fusión de flujo no está actualmente implementada en la base de GHC (es decir, no puedes usar las funciones de Preludio). Para obtener más información, consulte el boleto 915 de GHC .

Para usar la fusión de secuencias, debe instalar la biblioteca de fusión de secuencias, importar Data.List.Stream (también puede importar Control.Monad.Stream) y solo usar funciones de ese módulo en lugar de las funciones de Preludio. Esto significa importar el Preludio ocultando todas las funciones de lista predeterminadas, y no usar construcciones [x..y] ni enumerar la comprensión.