我正在使用turtle
在Haskell中編寫一個shell腳本,並希望瞭解有關編寫可能失敗的命令的最佳實踐。在海龜中編寫ExitCodes。爲什麼沒有Monad/Monad Transformer實例?
現在我有一個CASE表達式的樓梯,像這樣:
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具有kind *類型,而Monad類型需要類型爲* - > *'的類型,因此不可能爲ExitCode創建一個Monad實例。類型參數)。 –
您可能會喜歡[我如何處理許多級別的縮進?](http://stackoverflow.com/q/33005903/791604)。 –