gpt4 book ai didi

haskell - 为什么 http-enumerator 中的 `http` 是 Iteratee?

转载 作者:行者123 更新时间:2023-12-04 02:19:37 25 4
gpt4 key购买 nike

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 就像一个单子(monad)解析器,它使用 x 类型的项目流.对 http 有意义的回调为 Iteratee ,因为它消耗响应体。

但是, http本身似乎不消耗任何输入。 httpLbs函数执行 http run_ (在 Data.Enumerator 中定义)。据我所知, run如果给它的 iteratee 需要输入,则认为这是一个错误:

-- | 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行动?

最佳答案

  • 通过 run 不是错误(或 run_ )一个 Iteratee期望输入;这就是为什么我们首先传入 enumEOF . Iteratee 无效在收到 EOF 后继续期待输入。
  • 通过留下 http 的结果在 Iteratee monad,您可以在同一管道中执行多个操作,例如将两个 HTTP 响应流式传输到一个文件中。
  • 关于haskell - 为什么 http-enumerator 中的 `http` 是 Iteratee?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7638326/

    25 4 0