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'的完整簽名,並澄清其回調參數消耗輸入(從我可以說的)。謝謝。 –