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
?
¿Cómo '' http' no consume datos de una conexión TCP? –
Los argumentos que ha omitido con '...' son importantes. Uno es una función que devuelve un Iteratee. – luqui
@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. –