我正在使用 Haskell 编写一个 shell 脚本,turtle
并且想知道编写可能失败的命令的最佳实践。
现在我有一个案例表达式楼梯,如下所示:
runRemote :: MonadIO io => Text -> Text -> io ()
runRemote oldVersion' newVersion' = sh $ do
mkdir "out"
e1 <- shell ("command " <> oldVersion') empty
case e1 of
ExitFailure n -> cleanup
ExitSuccess -> do
e2 <- shell ("command " <> newVersion') empty
case e2 of
ExitFailure n -> cleanup
ExitSuccess -> do
curDir <- pwd
cd (curDir <.> oldVersion')
e3 <- shell ("command something else") empty
case e3 of
-- ...
-- And so on...
如果case
表达式在Maybe
类型上进行扩展,解决方案将是派生一个Monad
实例。
库作者是否有特殊原因尚未为其派生Monad
实例,ExitCode
或者是否有更好的方法来对 Haskell shell 代码进行错误处理?