सीधे नहीं। समस्या यह है कि पात्र एक अंतर्निहित प्रकार हैं जिसमें बहुरूपता के लिए कोई सुविधा नहीं है। यह संख्यात्मक अक्षरों से अलग है, जिन्हें Num
प्रकार वर्ग के माध्यम से पॉलिमॉर्फिक होने के लिए डिज़ाइन किया गया है।
यह कहा गया है कि, आप दो बुनियादी दृष्टिकोण ले सकते हैं: स्मार्ट कन्स्ट्रक्टर के साथ एक नया प्रकार का रैपर, या बिल्कुल नया प्रकार।
newtype आवरण का उपयोग करना आसान है:
module Vowel (Vowel, vowel, fromVowel) where
newtype Vowel = Vowel Char
vowel :: Char -> Maybe (Vowel)
vowel x | x `elem` "aeiouAEIOU" = Just (Vowel x)
| otherwise = Nothing
fromVowel :: Vowel -> Char
fromVowel (Vowel x) = x
के बाद से Vowel
निर्माता निर्यात नहीं किया है, तो नई Vowel
ही vowel
समारोह है, जो केवल पात्रों आप चाहते मानते द्वारा बनाई जा सकती है।
तुम भी कर सकता है इस तरह एक नए प्रकार:
data Vowel = A | E | I | O | U | Aa | Ee | Ii | Oo | Uu
fromChar :: Char -> Maybe Vowel
fromChar 'a' = Just Aa
fromChar 'A' = Just A
-- etc.
toChar :: Vowel -> Char
toChar Aa = 'a'
toChar A = 'A'
यह दूसरा रास्ता बहुत हैवीवेट है, और इसलिए भी बहुत कुछ अजीब उपयोग करने के लिए है।
तो ऐसा करने का तरीका है। मुझे पूरा यकीन नहीं है कि आप हालांकि चाहते हैं। सामान्य मुहावरे उन प्रकारों को बनाना है जो आपके डेटा का प्रतिनिधित्व करते हैं, और आप विशेष रूप से स्वरों का प्रतिनिधित्व नहीं करते हैं।
newtype CleanString = Cleaned { raw :: String }
-- user input needs to be sanitized
cleanString :: String -> CleanString
यहाँ newtype unsanitized और स्वच्छ इनपुट बीच अंतर: एक आम पैटर्न कुछ इस तरह होगा। यदि CleanString
बनाने का एकमात्र तरीका cleanString
है, तो आप स्थिर रूप से जानते हैं कि प्रत्येक CleanString
ठीक से संचरित है (बशर्ते cleanString
सही है)। आपके मामले में, ऐसा लगता है कि आपको वास्तव में व्यंजनों के लिए एक प्रकार की आवश्यकता है, स्वर नहीं।
हास्केल में न्यूटाइप बहुत हल्के हैं *, लेकिन प्रोग्रामर को रैपिंग और अनैपिंग करने के लिए कोड लिखना और उपयोग करना होगा। कई मामलों में लाभ अतिरिक्त काम से अधिक है। हालांकि, मैं वास्तव में किसी भी एप्लिकेशन के बारे में नहीं सोच सकता जहां यह जानना महत्वपूर्ण है कि आपका String
स्वर-मुक्त है, इसलिए मैं शायद सादा String
के साथ काम करता हूं।
* न्यूटाइप केवल संकलन-समय पर मौजूद हैं, इसलिए सिद्धांत में इनका उपयोग करने के लिए कोई रनटाइम प्रदर्शन लागत नहीं है। हालांकि, उनका अस्तित्व उत्पादित कोड को बदल सकता है (उदा। आरयूएलई को अवरुद्ध करना), इसलिए कभी-कभी एक मापनीय प्रदर्शन प्रभाव होता है।
मुझे पता है कि स्वर यूनिक्स नाम में अनुमति नहीं थी नहीं था,) –
क्यों आप "स्वर के लिए डेटा प्रकार" एक चाहते हैं? यह क्या करेगा –
@ एन्सेल, संभवतः एक 'चार' हो जिसका मूल्य केवल स्वरों पर ही ले सकता है। यह 'यूनिक्सनाम' के लिए शुद्धता मानदंडों में से एक घोषित करने का एक तरीका होगा। एर ... वास्तव में नहीं क्योंकि उसे इसके पूरक की जरूरत है, लेकिन आपको विचार मिलता है। – luqui