2016-12-08 6 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はハンドル・ペアを返し、std_inはStdStreamを要求します。

ハンドルをstdstreamに変換する方法を教えてください。

ありがとうございます!ソートされたディレクトリのリストを印刷し、

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

をし、それが実行されます:

答えて

4

StdStreamは、変換を実行するので、読むために、あなたのコードを調整しますUseHandleコンストラクタを持っています。

しかし、プロセスが完了した後に "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" 

を、あなたが行くように良いことがあります

+0

助けてくれてありがとう。 – Wolfe

関連する問題