Почему `http` в http-enumerator является Iteratee?

Сигнатура типа для 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 ?

11
задан Joey Adams 3 October 2011 в 19:14
поделиться