2011-10-03 7 views
11

El tipo de firma para http es:¿Por qué `http` en http-enumerator es un Iteratee?

http :: MonadIO m 
    => Request m 
    -> (W.Status -> W.ResponseHeaders -> Iteratee S.ByteString m a) 
    -> Manager 
    -> Iteratee S.ByteString m a 

Por qué no es este lugar?

http :: MonadIO m => … -> m a 

Si he entendido bien, una Iteratee x m a es como un analizador monádico que consume una corriente de artículos de tipo x. Tiene sentido que la devolución de llamada http sea Iteratee, ya que consume el cuerpo de respuesta.

Sin embargo, http en sí mismo no consume ninguna entrada. La función httpLbs ejecuta http con run_ (definida en Data.Enumerator). De lo que puedo decir, run considera que es un error si el iteratee dado a que espera de entrada:

-- | Run an iteratee until it finishes, and return either the final value 
-- (if it succeeded) or the error (if it failed). 
run :: Monad m => Iteratee a m b 
    -> m (Either Exc.SomeException b) 
run i = do 
    mStep <- runIteratee $ enumEOF ==<< i 
    case mStep of 
     Error err -> return $ Left err 
     Yield x _ -> return $ Right x 
     Continue _ -> error "run: divergent iteratee" 

Así que si no consume http de entrada, ¿por qué es un iteratee? ¿Por qué no es solo una acción MonadIO?

+1

¿Cómo '' http' no consume datos de una conexión TCP? –

+0

Los argumentos que ha omitido con '...' son importantes. Uno es una función que devuelve un Iteratee. – luqui

+0

@luqui: edité la publicación para incluir la firma completa de 'http', y para aclarar que su argumento de devolución de llamada consume información (por lo que puedo decir). Gracias. –

Respuesta

6
  1. No es un error de pasar run (o run_) un Iteratee que espera de entrada; es por eso que primero pasamos en enumEOF. No es válido que Iteratee continúe esperando la entrada después de recibir un EOF.
  2. Al dejar el resultado de http en la mónada Iteratee, puede realizar varias acciones en la misma canalización, como la transmisión de dos respuestas HTTP a un archivo.
Cuestiones relacionadas