Сигнатура типа для http
:
http :: MonadIO m
=> Request m
-> (W.Status -> W.ResponseHeaders -> Iteratee S.ByteString m a)
-> Manager
-> Iteratee S.ByteString m a
Почему не это вместо этого?
http :: MonadIO m => … -> m a
Если я правильно понимаю, Iteratee xma
подобен монадическому синтаксическому анализатору, который потребляет поток элементов типа x
. Обратный вызов http
имеет смысл быть Iteratee
, поскольку он потребляет тело ответа.
Однако http
, похоже, не использует никаких входных данных. Функция httpLbs выполняет http
с run_
(определено в Data.Enumerator). Насколько я могу судить, run
считает это ошибкой, если данный ему итератор ожидает ввода:
-- | 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"
Итак, если http
не потребляет ввод, почему это итерация? Почему это не просто действие MonadIO
?