Sto eseguendo il porting di un'applicazione Java su Haskell. Il metodo principale dell'applicazione Java segue il modello:Come implementare l'uscita anticipata/il ritorno in Haskell?
public static void main(String [] args)
{
if (args.length == 0)
{
System.out.println("Invalid number of arguments.");
System.exit(1);
}
SomeDataType d = getData(arg[0]);
if (!dataOk(d))
{
System.out.println("Could not read input data.");
System.exit(1);
}
SomeDataType r = processData(d);
if (!resultOk(r))
{
System.out.println("Processing failed.");
System.exit(1);
}
...
}
Così ho diverse fasi e dopo ogni passo possibile uscire con un codice di errore, o continuare al passo successivo.
Il mio tentativo di porting questo per Haskell è la seguente:
main :: IO()
main = do
a <- getArgs
if (null args)
then do
putStrLn "Invalid number of arguments."
exitWith (ExitFailure 1)
else do
-- The rest of the main function goes here.
Con questa soluzione, avrò un sacco di nidificato if-then-else
(uno per ogni punto di uscita del codice Java originale).
Esiste un modo più elegante/idiomatico per implementare questo modello in Haskell? In generale, che cos'è un modo idiomatico di Haskell per implementare un exit/return anticipato come usato in un linguaggio imperativo come Java?
Si prega di leggere l'esempio di Walking the Line dalla pagina http://learnyouahaskell.com/a-fistful-of-monads. Fornisce un esempio di Monad che utilizza il tipo di dati Forse. Una volta che il risultato di qualsiasi espressione è Nothing, il risultato di tutte le seguenti espressioni è Nothing, buono come sei uscito nel punto di errore. –
@ManojR - Forse non è proprio adatto qui poiché vuoi anche il motivo del fallimento. – Lee
L'approccio classico è dividere il processo in una funzione di elaborazione "fidata" (che presuppone che i parametri siano corretti) e una funzione di controllo di integrità "paranoico" (che controlla solo se i parametri sono corretti) ... –