haskell - 管道两个子流程时的异常行为
问题描述
我对以下代码有不礼貌的行为
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Concurrent (threadDelay)
import qualified Control.Concurrent.Async as Async
import qualified System.Process.Typed as Proc
import qualified System.Process as P
import qualified GHC.IO.Handle as H
main :: IO ()
main = do
print "starting"
(readEnd, writeEnd) <- P.createPipe
let p1 = Proc.setStdout (Proc.useHandleClose writeEnd) "echo -n 'foo'"
let p2 = Proc.setStdin (Proc.useHandleClose readEnd) "base64 -"
Async.concurrently
(threadDelay 1000 *> Proc.runProcess_ p2) -- with the delay, it works
-- (Proc.runProcess_ p2) -- that line will make the program hang forever
(Proc.runProcess_ p1)
print "done"
我想将标准输出从第一个子进程传送到第二个子进程。我尝试使用getStdout
,setStdin
但遇到了类型检查器的问题:
Proc.withProcess_ "echo -n foo" $ \r1 -> do
let p2 = Proc.setStdin (Proc.getStdout r1) "base64"
• Couldn't match expected type ‘Proc.StreamSpec
'Proc.STInput stdin0’
with actual type ‘()’
• In the first argument of ‘Proc.setStdin’, namely
‘(Proc.getStdout r1)’
In the expression: Proc.setStdin (Proc.getStdout r1) "base64"
解决方案
推荐阅读
- java - java.sql.SQLException: 列 'Max(category_id' 未找到
- python - Python 相对路径
- arrays - Python迭代数组
- html - 如何在 A-Frame 中正确加载 GTLF 文件(特别是在故障中?)
- javascript - 确保在 Angular 注入服务之前完全初始化服务?
- python - 如何从键值对字典中检索前 5 个最大值(整数)?
- c# - 使用多级嵌套反序列化 JSON
- javascript - 用 Lodash 分组
- javascript - Marker Clusterer 不是构造函数
- sql - 在 Oracle 中将对象存储到 SQL 数据库中