Các loại chữ ký cho http
là:Tại sao là `http` trong http-enumerator một Iteratee?
http :: MonadIO m
=> Request m
-> (W.Status -> W.ResponseHeaders -> Iteratee S.ByteString m a)
-> Manager
-> Iteratee S.ByteString m a
Tại sao không phải là nó này để thay thế?
http :: MonadIO m => … -> m a
Nếu tôi hiểu đúng, một Iteratee x m a
giống như một phân tích cú pháp monadic rằng tiêu thụ một dòng sản phẩm của loại x
. Nó có ý nghĩa đối với gọi lại của http
là Iteratee
, vì nó tiêu thụ nội dung phản hồi.
Tuy nhiên, http
chính nó dường như không tiêu thụ bất kỳ đầu vào nào. Hàm httpLbs thực hiện http
với run_
(được định nghĩa trong Data.Enumerator). Từ những gì tôi có thể nói, run
xem xét nó một lỗi nếu iteratee trao cho họ hy vọng đầu vào:
-- | 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"
Vì vậy, nếu http
không tiêu thụ đầu vào, tại sao nó lại một iteratee? Tại sao nó không chỉ là một hành động MonadIO
?
Làm thế nào để 'http' không tiêu thụ dữ liệu từ kết nối TCP? –
Các đối số bạn đã bỏ qua bằng cách sử dụng '...' là quan trọng. Một là một hàm trả về một Iteratee. – luqui
@luqui: Tôi đã chỉnh sửa bài đăng để bao gồm chữ ký đầy đủ của 'http' và để làm rõ rằng đối số gọi lại của nó tiêu thụ đầu vào (từ những gì tôi có thể biết). Cảm ơn. –