Я пишу сценарий оболочки в Haskell с помощью turtle
и хотел бы знать лучшие практики составления команд, которые могут выйти из строя.Составление ExitCodes в Черепахе. Почему нет экземпляра Monad/Monad Transformer?
Теперь у меня есть случай, выражение лестницы, например, так:
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?
Невозможно создать экземпляр 'Monad' для' ExitCode', потому что 'ExitCode' имеет вид' * ', а класс типа' Monad' требует типа с видом '* -> *' (тип, который имеет аргумент типа). –
Вам может понравиться [Как я могу справиться со многими уровнями отступов?] (Http://stackoverflow.com/q/33005903/791604). –