gpt4 book ai didi

Haskell - 使用从 createProcess 和 CreatePipe 创建的句柄通过管道传输到 StdStream

转载 作者:行者123 更新时间:2023-12-01 11:22:04 25 4
gpt4 key购买 nike

我目前有这个代码:

main :: IO ()                                                                       
main = do
(_, Just so, _, _) <- createProcess (proc "ls" ["."]) { std_out = CreatePipe }
_ <- createProcess (proc "sort" []) { std_in = so }
print "foo"

我得到的错误是:
 Couldn't match expected type ‘StdStream’                 
with actual type ‘GHC.IO.Handle.Types.Handle’
In the ‘std_in’ field of a record
In the first argument of ‘createProcess’, namely
‘(proc "sort" []) {std_in = so}’
In a stmt of a 'do' block:
_ <- createProcess ((proc "sort" []) {std_in = so})

我正在尝试将 ls 进程的输出通过管道传输到排序进程,但是 CreatePipe 返回一个句柄对,而 std_in 需要一个 StdStream。

我将如何将句柄转换为标准流。

谢谢!

最佳答案

StdStream有一个 UseHandle将执行转换的构造函数,因此调整您的代码以读取:

_ <- createProcess (proc "sort" []) { std_in = UseHandle so }

它会运行,打印一个排序的目录列表。

但是,如果您希望在进程完成后打印“foo”,则需要先等待两个进程。 (无论如何你都想这样做,否则你会有一堆“僵尸”进程在 Haskell 终止之前挂起。)调整你的代码以阅读:
main = do                                                                         
(_, Just so, _, ph1) <- createProcess (proc "ls" ["."])
{ std_out = CreatePipe }
(_, _, _, ph2) <- createProcess (proc "sort" []) { std_in = UseHandle so }
waitForProcess ph1
waitForProcess ph2
print "foo"

你应该很高兴去

关于Haskell - 使用从 createProcess 和 CreatePipe 创建的句柄通过管道传输到 StdStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41030168/

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