我目前有这段代码:
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返回一个Handle对,而std_in需要一个StdStream。
我如何将句柄转换为stdstream。
谢谢!
答案 0 :(得分:4)
StdStream
有一个UseHandle
构造函数可以执行转换,因此请将代码调整为:
_ <- createProcess (proc "sort" []) { std_in = UseHandle so }
并且它将运行,打印已排序的目录列表。
然而,如果你想要&#34; foo&#34;要在进程完成后打印,您需要先等待两个进程。 (无论如何你想要做到这一点,或者你有一堆&#34;僵尸&#34;进程在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"
你应该好好去