2016-12-08 30 views
2

我現在有這樣的代碼:哈斯克爾 - 運用的CreateProcess和CreatePipe創建管手柄扳到StdStream

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。

謝謝!

回答

4

StdStreamUseHandle構造函數執行轉換,那麼調整你的代碼如下:

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

,它會運行,打印目錄列表的分類。

但是,如果您想在流程完成後打印「foo」,則需要先等待兩個流程。 (您無論如何要做到這一點,否則你就會有一堆「殭屍」進程遊逛,直到哈斯克爾終止的。)調整你的代碼如下:

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" 

,你應該是好去

+0

非常感謝您的幫助。 – Wolfe