11
类型签名http
是:为什么http-enumerator中的http是一个Iteratee?
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
认为,如果赋予它的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
不消耗输入,为什么一个iteratee?为什么它不只是一个MonadIO
行动?
'http'如何不消耗TCP连接的数据? – 2011-10-03 18:29:17
您使用'...'省略的参数很重要。一个是返回一个Iteratee的函数。 – luqui
@luqui:我编辑帖子以包含'http'的完整签名,并澄清其回调参数消耗输入(从我可以说的)。谢谢。 –