Типичная подпись для 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 x m a похож на монадический синтаксический анализатор, который потребляет поток элементов типа 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?