2017-10-10 1 views
1

나는 작업자 기능IO-스트림 partitionEithers는

worker :: a -> Either b c 

을하고 난 a의 스트림에 적용하고 bc 2 개 스트림을 생성 할 더욱 그 스트림을 처리합니다. 예를 들어, Mapc을 축적하고 (기본적으로 스트림을 폴드) bstderr에 출력하고 싶습니다.

io-streams으로 어떻게하면됩니까? connect 번을 두 번 호출 할 수없는 것 같습니다. 그래서 분할 전에 넣어, 그래서 파티션은 "contravariant"방식으로 OutputStream에 작동합니다 : 그것은 구현 가능한

contrapartitionEithers 
    :: OutputStream b -> OutputStream c -> IO (OutputStream (Either b c)) 

인가? 그렇지 않다면 어떻게해야 할 일이 있습니까? 그렇다면, 어떻게 든 "이중"이 System.IO.Streams.zip입니까?

System.IO.Streams.zip 
    :: InputStream a -> InputStream b -> IO (InputStream (a, b)) 

답변

2

때때로 올바른 질문에 답변이 포함되어 있습니다. 따라서 실제로 가능합니다.

contrapartitionEithers 
    :: OutputStream b -> OutputStream c -> IO (OutputStream (Either b c)) 
contrapartitionEithers b c = makeOutputStream $ maybe 
    (writeTo b Nothing >> writeTo c Nothing) 
    (either (writeTo b . Just) (writeTo c . Just))