2011-10-03 30 views
11

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 httpIteratee, 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?

+1

Làm thế nào để 'http' không tiêu thụ dữ liệu từ kết nối TCP? –

+0

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

+0

@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. –

Trả lời

6
  1. Không phải là lỗi khi vượt qua run (hoặc run_) một số Iteratee dự kiến ​​đầu vào; đó là lý do tại sao chúng tôi lần đầu tiên vượt qua trong enumEOF. Nó không hợp lệ cho một số Iteratee để tiếp tục mong đợi đầu vào sau khi nhận được EOF.
  2. Bằng cách để lại kết quả của http trong đơn vị Iteratee, bạn có thể thực hiện nhiều tác vụ trong cùng một đường dẫn, chẳng hạn như phát hai phản hồi HTTP vào một tệp.
Các vấn đề liên quan