我正在使用
现在我有一个如下所示的表达式阶梯:
如果
库作者没有为
turtle
编写Haskell的shell脚本,并想了解有关组合可能失败的命令的最佳实践。现在我有一个如下所示的表达式阶梯:
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
实例。库作者没有为
ExitCode
派生一个Monad
实例是否有特殊的原因,或者有更好的方法来处理Haskell shell代码的错误处理?
ExitCode
创建一个Monad
实例,因为ExitCode
的 kind 是*
,而Monad
类型类需要一个 kind 为* -> *
的类型(即具有类型参数的类型)。 - David Young