假设我Proxy在 Haskell Pipes 中有两个。它们代表外部系统进程。
produce :: MonadIO m => Producer ByteString m ExitCode
consume :: MonadIO m => Consumer ByteString m ExitCode
Run Code Online (Sandbox Code Playgroud)
所以我把它们挂在一个Effect,像这样:
effect :: Effect m ExitCode
effect = produce >-> consume
Run Code Online (Sandbox Code Playgroud)
这将从终止的第一个Effect开始给我。通常,这将是,而不是。即使它没有首先终止,获得返回值的惯用 Pipes 方法是什么?ExitCodeProxyproduceconsumeconsume
到目前为止,我认为如果不进行某种令人讨厌的带内信令,这是不可能的,因此consume知道流已完成。最后一个代理知道关闭的唯一方法是从 中获取一些东西await,所以我可以向它发送一个空ByteString的信号来表示流已完成。只是感觉不太对劲。我现在拥有的是一个单独的 MVar,它可以提供退出值,但我认为必须有一种更惯用的方法来做到这一点。