11

の型シグネチャ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 のアイテムのストリームを消費するモナド パーサーのようなものですxhttpのコールバックIterateeは、応答本文を消費するため、 であることが理にかなっています。

ただし、httpそれ自体は入力を消費していないようです。httpLbs関数は (Data.Enumerator で定義) で実行さhttprun_ます。私が言えることから、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行動ではないのですか?

4

1 に答える 1

6
  1. 入力を期待するan を渡すrun(またはrun_)ことはエラーではありません。Iterateeそのため、最初に を渡しenumEOFます。Iterateeが EOF を受け取った後も入力を期待し続けることは無効です。
  2. 結果をモナドに残すことでhttpIteratee2 つの HTTP 応答をファイルにストリーミングするなど、同じパイプラインで複数のアクションを実行できます。
于 2011-10-04T03:23:14.797 に答える