2011-12-29 12 views
9

Descargo de responsabilidad: esto se preguntó recientemente en la lista de haskell-cafe. Mis disculpas a cualquiera que se haya molestado por el doble post.Componer enumerados en el enumerador

Todos los paquetes iteratee-implementación, que yo sepa (por ejemplo iteratee, iterIO y conduit) definen una función de la composición enumeratee, excepto para el paquete enumerator. Esto me parece como una limitación seria, y sin embargo, también parece relativamente sencillo de implementar:

import Data.Enumerator 
import Data.Enumerator.Internal 

(=$=) :: Monad m 
     => Enumeratee a0 a1 m (Step a2 m b) -> Enumeratee a1 a2 m b 
     -> Enumeratee a0 a2 m b 
(=$=) e01 e12 step = Iteratee $ do 
    step' <- runIteratee $ e12 step 
    runIteratee . joinI $ e01 step' 

¿Hay alguna Gotcha aquí que me falta? ¿O alguna otra razón para enumerator no definir enumeratee composition?

+0

He enviado un correo electrónico al autor/mantenedor de [el paquete del enumerador] (http://hackage.haskell.org/package/enumerator), John Millikin, que lo relaciona con esta pregunta. –

Respuesta

2

Ahora hay una nueva versión (0.4.17) de enumerator que incluye un operador de (=$=) con la firma que di más arriba. Envié un correo electrónico al autor del paquete y él hace un buen caso en contra de incluir una gran cantidad de operadores simplificados (como ($=), (=$), y ahora (=$=)) en el paquete.

Básicamente, el problema es el manejo de la entrada sobrante. Los joinI combinator

joinI :: Monad m => Iteratee a m (Step a' m b) -> Iteratee a m b 

descartes de la izquierda más de Stream a' que está cedido por el interior Iteratee. Este no es un problema si se utiliza un estilo como

joinI (foo $$ (bar $$ baz)) 

donde los datos sobrantes solamente se desecha al final de la computación. Sin embargo, al usar los operadores simplificados, se obtienen múltiples combinaciones implícitas y los datos sobrantes se vuelven mucho más difíciles de rastrear. Si las iteraciones que se utilizan son simples (es decir, no arrojan datos sobrantes), entonces esto no es un problema y los operadores simplificados tienen sentido.

Cuestiones relacionadas