इस मामले में, Maybe
पर्याप्त नहीं हो सकता है:
- उपयोगकर्ता कुछ भी नहीं
में प्रवेश किया: आप तीन शर्तों के बारे में चिंता करने की ज़रूरत
- उपयोगकर्ता इनपुट मान्य था
- उपयोगकर्ता इनपुट अवांछनीय
यह डेटा प्रकार और समारोह इस सीधे व्यक्त:
data Input a = NoInput | Input a | BadInput String
deriving (Eq, Show)
input :: (Read a) => String -> Input a
input "" = NoInput
input s =
case filter (null.snd) (reads s) of
((a,_):_) -> Input a
otherwise -> BadInput s
नोट बल्कि अधूरा समारोह read
का उपयोग करने से, यह reads
का उपयोग करता है जो इनपुट पर त्रुटि नहीं है जो नहीं बदला जा सकता होगा। reads
में कुछ हद तक अजीब इंटरफ़ेस है, हां, इसलिए मैं लगभग हमेशा उस फ़ंक्शन में लपेटता हूं जो Maybe a
या यहां कुछ ऐसा देता है।
उदाहरण उपयोग:
> input "42" :: Input Int
Input 42
> input "cat" :: Input Int
BadInput "cat"
> input "" :: Input Int
NoInput
मैं इस तरह अपने yearFilter
समारोह कोड होगा:
yearFilter :: Maybe Int -> Int -> Bool
yearFilter Nothing _ = True
yearFilter (Just x) y = x == objectYear y
तब मैं उपयोगकर्ता इनपुट संभाल चाहते हैं के रूप में:
inputToMaybe :: Input a -> Maybe a
inputToMaybe (Input a) = Just a
inputToMaybe _ = Nothing
do
a <- input `fmap` getLine
case a of
BadInput s -> putStrLn ("Didn't understand " ++ show s)
otherwise -> ... yearFilter (inputToMaybe a) ....
एनबी : मैंने साफ कर लिया है कोड yearFilter
में थोड़ा सा: परीक्षण से बूलियन का उत्पादन करने के लिए गार्ड का उपयोग करने की आवश्यकता नहीं है - बस परीक्षण, फ़ंक्शन एप्लिकेशन (objectYear
) ऑपरेटर (==
) से अधिक कठोर बांधता है ताकि हटाए गए कोष्ठक को _
के साथ अप्रयुक्त इनपुट के नामों को प्रतिस्थापित किया जा सके।
ठीक है, मैं मानता मैं अपने आप को मदद नहीं कर सकता .... मैं एक बार फिर yearFilter
फिर से लिख दिया, इस बार के रूप में मैं झुका दिया जाएगा यह लिखने के लिए:
yearFilter :: Maybe Int -> Int -> Bool
yearFilter x y = maybe True (== objectYear y) x
Maybe
के बारे में सीखना और maybe
हास्केल के बारे में पहली बात थी जिसने मुझे वास्तव में भाषा से प्यार किया।
कृपया, लोगों की लंबाई x == 0' सिखाएं। इस परीक्षा को लिखने के लिए बेवकूफ और निष्पादक तरीका 'शून्य x' है। –
बेवकूफ होने के नाते, बिंदु ले लिया। 'लंबाई' की परिभाषा को देखते हुए, मुझे विश्वास नहीं है कि परफ में कोई अंतर होगा। किसी भी मामले में, मुझे आश्चर्य है कि किसी को भी नीचे वोट करने की आवश्यकता महसूस हुई। लंबाई जानने के लिए –
"लंबाई" स्ट्रिंग को बहुत अंत तक चलने के लिए चलती है, और यदि वह स्ट्रिंग 40020320 9 वर्ण है, तो आपको एक प्रदर्शन समस्या मिली है। "शून्य" निरंतर समय में चलेगा, क्योंकि इसे देखने की आवश्यकता है कि कम से कम एक तत्व वहां है या नहीं। – LukeN