我有一个工人职能
worker :: a -> Either b c
我希望将其应用于a
的流,并生成2个b
和c
的流,并进一步处理这些流。例如,我想在c
中积累Map
(主要是为了折叠流)并将b
输出到stderr
。
如何使用io-streams
实现此目的?好像我不能两次打电话给connect
。所以我必须在分区之前把它放到分区,因此分区将以“逆变”的方式在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))
答案 0 :(得分: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))