सामान्य स्ट्रिंग की तुलना केवल लेक्सिकोोग्राफ़िकल ऑर्डरिंग पर काम करती है, स्ट्रिंग की लंबाई नहीं।
smaller :: String -> String -> Bool
smaller s1 s2 | length s1 < length s2 = True
| length s1 > length s2 = False
| otherwise = s1 < s2
या थोड़ा अधिक सामान्य:
compareStrings :: String -> String -> Ordering
compareStrings s1 s2 | length s1 < length s2 = LT
| length s1 > length s2 = GT
| otherwise = compare s1 s2
उदाहरण:
ghci> compare "ab" "z"
LT
ghci> compareStrings "ab" "z"
GT
तो तुम भी लंबाई के लिए जाँच करने के लिए अपने स्वयं के समारोह लिखने के लिए होगा
हम मोनोइड्स के साथ घूम रहे थे
instance Ord a => Ord [a] where
compare = comparing length
`mappend` comparing head `mappend` comparing tail
लेकिन अगर आप काफी यह समझ में नहीं आता, मैं तुम्हें पहले परिभाषा ;-)
स्रोत
2009-05-04 10:50:03
यह मेरे संस्करण की तुलना में स्पष्ट रूप से तेज़ है, क्योंकि यह केवल एक बार स्ट्रिंग की लंबाई की गणना करता है। यह इनपुट स्ट्रिंग्स पर प्रत्यक्ष पैटर्न मिलान करके शायद तेज़ी से भी बनाया जा सकता है, जिससे इस परिभाषा को विलय और 'लंबाई' फ़ंक्शन की परिभाषा मिलती है। –
हास्केल सामान्यीकरण और अच्छी कोडिंग प्रथाओं के बारे में है, और इसकी एक बहुत अच्छी प्रकार (कक्षा) प्रणाली है। फ़ंक्शन को 'तुलना' के रूप में क्यों नहीं लिखें :: Ord a => [a] -> [a] -> ऑर्डरिंग 'या तो? –
@ एलेक्सेंडर: यह निर्भर करता है कि ओपी क्या चाहता है।चूंकि ओपी ने काफी प्राथमिक प्रश्न पूछा है, शायद वह एक प्राथमिक उत्तर चाहता है? मुझे संदेह नहीं है कि हास्केल में ऐसे फ़ंक्शन को लिखने के लिए तेज़ और/या अधिक बेवकूफ तरीके हैं, लेकिन शायद ओपी सीखने में मदद करने के लिए चीजों को सरल रखना बेहतर है। –