JavaアプリケーションをHaskellに移植しています。Javaアプリケーションの主なメソッドは、次のパターンに従います。
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);
}
...
}
したがって、さまざまな手順があり、各手順の後にエラーコードを表示して終了するか、次の手順に進むことができます。
これをHaskellに移植しようとした私の試みは次のとおりです。
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.
このソリューションでは、ネストされたものがたくさんありますif-then-else
(元のJavaコードの出口点ごとに1つ)。
Haskellでこのパターンを実装するためのよりエレガントで慣用的な方法はありますか?一般に、Javaのような命令型言語で使用されるような早期終了/復帰を実装するHaskellの慣用的な方法は何ですか?