2011-10-03 2 views
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 ax 유형의 항목 스트림을 사용하는 모나 딕 파서와 같습니다. http의 콜백이 Iteratee 인 것은 응답 본문을 사용하므로 의미가 있습니다.

그러나 http 자체는 입력을 소비하지 않는 것 같습니다. httpLbs 함수는 http (Data.Enumerator에서 정의 됨)을 사용하여 http을 실행합니다.

그래서 http가 입력을 사용하지 않으면 왜 iteratee입니까? MonadIO 액션이 아닌 이유는 무엇입니까?

+1

어떻게'http'가 TCP 연결에서 데이터를 소비하지 않습니까? –

+0

'...'를 사용하여 생략 한 인수가 중요합니다. 하나는 Iteratee를 반환하는 함수입니다. – luqui

+0

@luqui : 나는이 게시물을 편집하여'http'의 전체 서명을 포함하고 콜백 인수가 (내가 말할 수있는 것에서) 입력을 소비한다는 것을 분명히했습니다. 감사. –

답변

6
  1. 입력이 기대 Iterateerun (또는 run_)를 통과하는 것은 오류 아니다; 그래서 우리는 처음에 enumEOF을 전달합니다. Iteratee이 EOF 수신 후 입력을 계속 예상하는 것은 유효하지 않습니다.
  2. Iteratee 모나드에 http의 결과를 남겨 두 HTTP 응답을 파일로 스트리밍하는 것과 같이 동일한 파이프 라인에서 여러 동작을 수행 할 수 있습니다.
관련 문제