Przesyłam aplikację Java do Haskell. Główną metodą aplikacji Java następujący wzór:Jak wdrożyć wcześniejsze wyjście/powrót w 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);
}
...
}
Więc mam różne kroki i po każdym etapie mogę albo wyjście z kodem błędu lub przejść do następnego kroku.
Moja próba Porting to Haskell jest następujący:
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.
Dzięki takiemu rozwiązaniu, nie będę miał wiele zagnieżdżonych if-then-else
(po jednym dla każdego punktu wyjścia oryginalnego kodu Java).
Czy istnieje bardziej elegancki/idiomatyczny sposób realizacji tego wzoru w Haskell? Ogólnie rzecz biorąc, jaki jest Haskell idiomatyczny sposób na wdrożenie wczesnego wyjścia/powrotu, stosowanego w imperatywnym języku, takim jak Java?
Proszę przeczytać przykład Spacerując po linii ze strony http://learnyouahaskell.com/a-fistful-of-monads. Podaje przykład Monady używającej Może typ. Gdy wynik jakiegokolwiek wyrażenia jest Niczym, wynikiem wszystkich następujących wyrażeń jest Nic, tak dobry jak wyszedłeś w punkcie awarii. –
@ManojR - Może nie jest to tutaj odpowiednie, ponieważ również chcesz podać przyczynę niepowodzenia. – Lee
Klasycznym podejściem jest podzielenie procesu na "ufającą" funkcję przetwarzania (która zakłada, że parametry są poprawne) i "paranoidalną" funkcję sprawdzania poprawności (która sprawdza tylko, czy parametry są poprawne) ... –