Ich schreibe ein Shell-Skript in Haskell mit turtle
und würde gerne Best Practices für das Verfassen von Befehlen kennen, die fehlschlagen könnten.ExitCodes in Turtle erstellen. Warum gibt es keine Monad/Monad Transformer-Instanz?
Jetzt habe ich einen Fall Ausdruck Treppe, etwa so:
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...
Wenn der case
Ausdruck auf einem Maybe
Typ wurde erweitert, würde die Lösung eine Monad
Instanz abzuleiten sein.
Gibt es einen besonderen Grund, warum der Bibliotheksautor nicht bereits eine Monad
Instanz für ExitCode
abgeleitet hat, oder gibt es eine bessere Möglichkeit, die Fehlerbehandlung für Haskell Shell-Code durchzuführen?
Es ist unmöglich, eine 'Monad' Instanz für' ExitCode' zu machen, weil 'ExitCode' hat Art' * 'und der' Monad' Typklasse erfordert eine Art mit Art '* -> *' (ein Typ, der hat ein Typ Argument). –
Sie mögen [Wie gehe ich mit vielen Ebenen der Einrückung um?] (Http://stackoverflow.com/q/33005903/791604). –