haskell - Conduit 的类似 fork 的功能

标签 haskell fork consumer conduit sink

我想计算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,但我不确定这是否是最佳解决方案。

最佳答案

确实你需要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)

关于haskell - Conduit 的类似 fork 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32287364/

相关文章:

haskell - 使用 Haskell 进行 Web 开发的主要好处是什么?

c - 只在一个 child 上 fork 的 Unix fork 树

java - Java 8 java.util.function.Consumer<> 的 c# 等价物是什么?

PHP OAuth 1.0 库,用于处理 api key / secret 对和端点(请求、授权和访问)

c - fork 和共享内存

python - 是否可以在 Python 中将 RabbitMQ 直接回复功能与 Pika 生成器使用者一起使用?

haskell - Haskell 中的 "truly"通用函数

haskell - 如何构建树中所有分支的列表?

haskell - 箭头的创造性使用

c++ - 检测 fork() 中的子进程创建