の型シグネチャ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
私の理解が正しければ、 anIteratee x m a
は type のアイテムのストリームを消費するモナド パーサーのようなものですx
。http
のコールバックIteratee
は、応答本文を消費するため、 であることが理にかなっています。
ただし、http
それ自体は入力を消費していないようです。httpLbs関数は (Data.Enumerator で定義) で実行さhttp
れrun_
ます。私が言えることから、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
行動ではないのですか?