私はJavaアプリケーションをHaskellに移植しています。 Javaアプリケーションのmainメソッドは、パターンに従う:Haskellで早期のexit/returnを実装する方法は?
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);
}
...
}
だから、私は異なるステップと、各ステップは、Iのいずれかできるエラーコードで終了するか、次のステップに進み後有します。次のように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.
このソリューションでは、私は(元のJavaコードの各出口点に1つ)、ネストされたif-then-else
がたくさんあります。
ハスケルでこのパターンを実装するためのよりエレガントで慣用的な方法はありますか?一般的に、Javaのような命令的言語で使われている初期のexit/returnを実装するHaskellの慣用方法は何ですか?
http://learnyouahaskell.com/a-fistful-of-monadsページからWalking the Lineの例をお読みください。これは、おそらくデータ型を使ってMonadの例を示しています。式の結果がNothingになると、すべての次の式の結果は、Nothingになります。これは、失敗した時点で終了したものと同じです。 –
@ManojR - あなたは失敗の理由も欲しいので、おそらくここにはあまり適していないでしょう。 – Lee
古典的なアプローチでは、プロセスを「信頼する」処理機能(パラメータが正しいと仮定)と「パラノイド」健全性チェック機能(パラメータが正しいかどうかのみをチェックする)に分割しています... –