首页 > 解决方案 > 如何在 Haskell 中执行命令列表?

问题描述

我是 Haskell 的新手,我一直在system为我执行 shell 命令,因为我只对退出状态感兴趣。我注意到,因为我可以做类似的事情:

ls <- system "ls"
pwd <- system "pwd"

这正确地执行了这两个命令。我正在考虑执行这些命令的数组,例如

lsAndPwd <- return $ system <$> ["ls", "pwd"]

我很惊讶这实际上并没有执行任何事情。这会编译,我检查了lsAndPwd它的类型是否正确,[IO GHC.IO.Exception.ExitCode]但命令从未执行过。发生了什么事,我怎样才能让它工作?

标签: haskell

解决方案


你应该使用mapM而不是<$>这样你得到一个IO [ExitCode],而不是一个[IO ExitCode]。这样,它就被收集到一个可以运行的 IO monad 中:

lsAndPwd <- mapM system ["ls", "pwd"]

或者,调用sequence整个事情:

lsAndPwd <- sequence $ system <$> ["ls", "pwd"]

推荐阅读