Haskell - 使用从createProcess和CreatePipe创建的句柄来管道进入StdStream

时间:2016-12-08 01:15:20

标签: haskell process

我目前有这段代码:

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。

谢谢!

1 个答案:

答案 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"

你应该好好去