gpt4 book ai didi

Haskell Pipes - 获取管道中最后一个代理的返回值

转载 作者:行者123 更新时间:2023-12-02 13:46:48 24 4
gpt4 key购买 nike

假设我在 Haskell Pipes 中有两个Proxy。它们代表外部系统进程。

produce :: MonadIO m => Producer ByteString m ExitCode
consume :: MonadIO m => Consumer ByteString m ExitCode

所以我将它们挂接到 Effect 中,如下所示:

effect :: Effect m ExitCode
effect = produce >-> consume

Effect将为我提供来自第一个终止的ProxyExitCode。通常这将是生产,而不是消费。即使它没有先终止,获取 consume 的返回值的惯用管道方法是什么?

到目前为止,我认为如果不执行某种令人讨厌的带内信令,那么这是不可能的,因此consume知道流已完成。最后一个代理知道关闭的唯一方法是从 await 获取某些内容,因此我可以向它发送一个空的 ByteString 来表示流已完成。但这感觉不太对劲。我现在拥有的是一个单独的 MVar,它可以提供退出值,但我认为必须有一种更惯用的方法来做到这一点。

最佳答案

如果没有带内信令,如果生产者首先返回,那么消费者将永远不可能有“返回值”。如果生产者正在返回,则意味着消费者必须被阻塞以等待请求的值。 Consumer 将永远不会再次运行,因此永远没有机会返回,直到 Consumer 获得具有请求值的带内信号.

仅仅因为信号是带内的并不意味着它需要“讨厌”。我们可以将可能返回的 Producer 转换为我们知道不会返回的 Producer (它的返回类型是 forall r' . r' )通过捕获返回并将其转发到下游。我们这样做forever以防另一个请求返回上游。

returnDownstream :: Monad m => Proxy a' a b' b m r -> Proxy a' a b' (Either r b) m r'
returnDownstream = (forever . respond . Left =<<) . (respond . Right <\\)

Consumer端,您需要显式处理当请求值时要做什么,而不是获取响应(在Right中) code>)您将获得上游生产者的返回值(在 Left 中)。

关于Haskell Pipes - 获取管道中最后一个代理的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29310140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com