Haskell:使用Maybe FilePath有条件地执行外部进程

时间:2011-10-28 16:42:16

标签: haskell

我正在努力理解在命令式世界中非常容易的代码块。 这就是我需要做的:给定一个可执行的完整路径,这是一个可能的FilePath类型,我需要有条件地执行它。 如果路径是Nothing - 打印错误,如果路径是Just Path - 执行它并打印文件已执行的消息。只有“Hello,World”才能更轻松,对吧? 但是在Haskell中,我将自己挖到了许多层中的Maybe和IO,并且卡住了。 这里出现两个具体问题: 如何将Maybe FilePath提供给系统或rawSystem? liftM在这里不适合我。 这种条件分支的正确方法是什么? 感谢。

3 个答案:

答案 0 :(得分:11)

简单的模式匹配可以很好地完成工作。

case command of
  Just path -> system path >> putStrLn "Done"
  Nothing   -> putStrLn "None specified"

答案 1 :(得分:3)

或者,如果您不想进行模式匹配,请使用maybe函数:

maybe (putStrLn "None specified") ((>> putStrLn "Done") . system) command

这可能偶尔比与case匹配更好,但不是在这里,我想。打印成功消息的构图很笨拙。如果您不打印消息但在两个分支中都返回ExitCode,则会更好:

maybe (return $ ExitFailure 1) system command

答案 2 :(得分:3)

这正是为Traversable类型做的!

Prelude Data.Traversable System.Cmd> traverse system Nothing
Nothing
Prelude Data.Traversable System.Cmd> traverse system (Just "echo OMG BEES")
OMG BEES
Just ExitSuccess