5

Haskell で簡単なプログラムを作成しようとしています。基本的に、2 つのシェル コマンドを並行して実行する必要があります。コードは次のとおりです。

import System.Cmd
import System.Exit
import Control.Monad

exitCodeToBool ExitSuccess = True
exitCodeToBool (ExitFailure _) = False

run :: String -> IO Bool
run = (fmap exitCodeToBool) . system

main = liftM2 (&&) (run "foo") (run "bar")

しかし、コマンド "foo" は ExitFailure を返し、"bar" は決して実行されないと予想します。これはそうではありません!どちらも実行され、両方ともコンソールにエラーが表示されます。

同時に

False && (all (/= 0) [1..])

完全によく評価されます。これは、2 番目の引数が計算されないことを意味します。アプリのシステム コマンドで同じことを行うにはどうすればよいですか?

4

3 に答える 3

2

コマンドを並行して実行し、「foo」が成功した場合にのみ「bar」を実行するとします。意味がない。並列で実行するか、順次実行するかを決定する必要があります。

「foo」が成功した場合にのみ「bar」を実行したい場合は、次を試してください。

import System.Process

main = do callCommand "foo"
          callCommand "bar"

または、並行して実行する場合は、次を試してください。

import System.Process
import Control.Concurrent


myForkIO :: IO () -> IO (MVar ())
myForkIO io = do
    mvar <- newEmptyMVar
    forkFinally io (\_ -> putMVar mvar ())
    return mvar

main = do mvar <- myForkIO $ callCommand "foo"
          callCommand "bar"
          takeMVar mvar
于 2014-04-11T13:36:58.123 に答える