3

我想计算http post body的哈希值并在接收时同时解析它,所以我需要一个这样的函数:

unionSinks :: Monad m => Consumer a m r1 -> Consumer a m r2 -> Consumer a m (r1, r2)
unionSinks = ...

sinkBody :: Monad m => FromJSON v => Consumer ByteString m (Digest SHA1, v)
sinkBody = sinkHash `unionSinks` sinkParser json

当我开发图像上传时,我passthroughSink以类似的方式使用。但在这种情况下,我不需要将图像保存到文件的管道的结果。

一般来说,我知道如何使用类似 MVar 的东西来实现 fork,但我不确定这是否是最佳解决方案。

4

1 回答 1

4

确实你需要ZipSink(或更一般ZipConduit):

import Control.Applicative
import Data.Conduit

unionSinks :: (Monad m) => Sink a m r1 -> Sink a m r2 -> Sink a m (r1, r2)
unionSinks s1 s2 = getZipSink ((,) <$> ZipSink s1 <*> ZipSink s2)
于 2015-08-29T16:55:49.557 回答