我是 Haskell 的新手,我一直在system为我执行 shell 命令,因为我只对退出状态感兴趣。我注意到,因为我可以做这样的事情:
ls <- system "ls"
pwd <- system "pwd"
Run Code Online (Sandbox Code Playgroud)
这正确地执行了两个命令。我正在考虑执行这些命令的数组,例如
lsAndPwd <- return $ system <$> ["ls", "pwd"]
Run Code Online (Sandbox Code Playgroud)
我很惊讶这实际上并没有执行任何操作。这会编译,我检查了lsAndPwd它的类型是否正确,[IO GHC.IO.Exception.ExitCode]但从未执行过命令。这是怎么回事,我怎样才能让它发挥作用?
你应该使用mapM而不是<$>这样你得到一个IO [ExitCode],而不是一个[IO ExitCode]。这样,它就被收集到一个可以运行的 IO monad 中:
lsAndPwd <- mapM system ["ls", "pwd"]
Run Code Online (Sandbox Code Playgroud)
或者,调用sequence整个事情:
lsAndPwd <- sequence $ system <$> ["ls", "pwd"]
Run Code Online (Sandbox Code Playgroud)