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