मैं जावा अनुप्रयोग को हास्केल पर पोर्ट कर रहा हूं। जावा आवेदन की मुख्य विधि का अनुसरण करता है:हास्केल में प्रारंभिक निकास/वापसी को कैसे कार्यान्वित करें?
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);
}
...
}
तो मैं विभिन्न चरणों है और हर कदम मैं या तो गलत कोड के साथ बाहर निकलें कर सकते हैं, या बाद में निम्नलिखित चरण पर जाएं।
हास्केल को यह पोर्टिंग पर मेरे प्रयास इस प्रकार है:
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
(मूल जावा कोड के प्रत्येक निकास बिंदु के लिए एक) के बहुत सारे होगा।
क्या हास्केल में इस पैटर्न को लागू करने का एक और अधिक सुरुचिपूर्ण/बेवकूफ तरीका है? आम तौर पर, जावा जैसी अनिवार्य भाषा में उपयोग किए जाने वाले प्रारंभिक निकास/वापसी को लागू करने के लिए हास्केल बेवकूफ तरीका क्या है?
कृपया http://learnyouahaskell.com/a-fistful-of-monads पृष्ठ से चलने वाली लाइन का उदाहरण पढ़ें। यह शायद डेटाटाइप का उपयोग करके मोनाड का उदाहरण देता है। एक बार अभिव्यक्ति का परिणाम कुछ भी नहीं है, तो निम्नलिखित सभी अभिव्यक्तियों का नतीजा कुछ भी नहीं है, जैसा कि आप विफलता बिंदु से बाहर निकले हैं। –
@ManojR - शायद यहां वास्तव में उपयुक्त नहीं है क्योंकि आप विफलता का कारण भी चाहते हैं। – Lee
क्लासिक दृष्टिकोण प्रक्रिया को "ट्रस्टिंग" प्रोसेसिंग फ़ंक्शन में विभाजित कर रहा है (जो मानता है कि पैरामीटर सही हैं) और एक "परावर्तक" सैनिटी चेक फ़ंक्शन (जो केवल पैरामीटर सही होने पर जांचता है) ... –