गणित अभिव्यक्तियों को पार्स करने के लिए कोड लिखने का प्रयास करते हुए हास्केल नौसिखिया। कोड:क्या हास्केल में गार्ड घोंसला करना संभव है?
isDigit :: Char -> Bool
isDigit c = c >= '0' && c <= '9'
parseNumber :: String -> Maybe (String, String)
parseNumber [] = Just ("", "")
parseNumber (h:ls)
| isDigit h
| p == Nothing = Just([h], ls) -- Digit found <<< ERROR!!
| otherwise = Just (h:fst d, snd d) -- Ends in a digit
| h == '.'
| p == Nothing = Nothing -- Ends in a point
| not ('.' `elem` (snd d)) = Just (h:(fst d), snd d) -- We don't want multiple dots
| otherwise = Nothing -- Not a number, stop looking!
where
p = parseNumber ls
Just d = parseNumber ls -- Float version of p. Not used if p is Nothing
यह समारोह एक स्ट्रिंग है एक संख्या के साथ शुरू होता है, और रिटर्न संख्या अभिव्यक्ति के बाकी हिस्सों से अलग कर लेने के लिए माना जाता है। उदाहरण:
parseNumber "123.0 + 2"
("123.0", "+ 2")
मैं इस नेस्टेड गार्ड 'वाक्य रचना वास्तव में अच्छी तरह से पढ़ता है लगता है, लेकिन यह नहीं है काम। त्रुटि रेखा के लिए,
इनपुट पर पार्स त्रुटि '|'
हैंडेल में जंजीर रक्षकों की अनुमति नहीं है? या मैं इसे गलत तरीके से लिख रहा हूं? इसके अलावा, मेरे पास चेन लॉजिक को सरल तरीके से कौन से विकल्प हैं?
धन्यवाद, यह पूरी तरह से काम करता है। मुझे बस पढ़ने के लिए थोड़ा मुश्किल लगता है। – SlySherZ