ListLike पैकेज जो आप ढूंढ रहे हैं उसे प्रदान करने के लिए प्रतीत होता है। मैंने कभी नहीं समझा है कि यह अधिक लोकप्रिय क्यों नहीं है।
सूची एक तरफ, एक कारण यह प्रीलूड में लागू नहीं किया गया है क्योंकि कुछ भाषा एक्सटेंशन (बहु-पैरा प्रकार के वर्ग और फंडप या संबंधित प्रकार) का आह्वान किए बिना ऐसा करना संभव नहीं है। वहाँ कंटेनरों के तीन प्रकार के विचार करने के लिए कर रहे हैं:
- कंटेनर है कि सभी पर अपने तत्वों के बारे में परवाह नहीं है (उदाहरण के लिए [])
- कंटेनर जो केवल (जैसे bytestrings)
- कंटेनरों विशिष्ट तत्वों के लिए लागू किया जाता है जो तत्वों पर बहुलक हैं लेकिन संदर्भ (उदाहरण के लिए Data.Vector.Storable, जो किसी भी प्रकार को एकउदाहरण के साथ रखेगा) की आवश्यकता है।
यहाँ किसी भी एक्सटेंशन का उपयोग किए बिना एक बहुत ही बुनियादी ListLike शैली वर्ग है:
class Listable container where
head :: container a -> a
instance Listable [] where
head (x:xs) = x
instance Listable ByteString where --compiler error, wrong kind
instance Listable SV.Vector where
head v = SV.head --compiler error, can't deduce context (Storable a)
यहाँ container
तरह *->*
है। यह bytestrings के लिए काम नहीं करेगा क्योंकि वे एक मनमाना प्रकार की अनुमति नहीं है; उनके पास *
है। यह डेटा के लिए भी काम नहीं करेगा। वेक्टर। स्टेटिकल वेक्टर, क्योंकि कक्षा में संदर्भ (स्टेरियल बाधा) शामिल नहीं है।
आप
class ListableMPTC container elem | container -> elem where
या
class ListableAT container where
type Elem container :: *
अब container
या तो अपने वर्ग परिभाषा बदलकर इस समस्या को ठीक कर सकते हैं प्रकार *
है; यह एक पूरी तरह से लागू प्रकार का कन्स्ट्रक्टर है। यही है, आपके उदाहरण
instance ListableMPTC [a] a where
जैसा दिखते हैं लेकिन अब आप Haskell98 नहीं हैं।
यही कारण है कि एक साधारण सूची-प्रकार इंटरफ़ेस भी गैर-तुच्छ है; जब आपके पास अलग-अलग संग्रह semantics खाते हैं (उदा। कतार) के लिए यह थोड़ा कठिन हो जाता है। दूसरी वास्तव में बड़ी चुनौती उत्परिवर्तनीय बनाम-अपरिवर्तनीय डेटा है। अब तक मैंने जो भी प्रयास देखा है (एक को छोड़कर) उस मुद्दे पर एक परिवर्तनीय इंटरफ़ेस और एक अपरिवर्तनीय बनाकर पेंट करता है। एक इंटरफ़ेस जो मुझे पता है, दोनों ने एकजुट किया था, वह दिमागी झुकाव था, विस्तार का एक समूह लगा, और काफी खराब प्रदर्शन था।
परिशिष्ट: bytestrings
पूरी तरह से मेरी ओर से अनुमान है, लेकिन मैं हम विकास के एक उत्पाद के रूप bytestrings के साथ फंस रहे हैं लगता है। यही है, वे कम प्रदर्शन I/O संचालन का पहला समाधान थे, और आईओ सिस्टम कॉल के साथ इंटरफेसिंग के लिए Ptr Word8
एस का उपयोग करना समझ में आया। पॉइंटर्स पर संचालनों को स्टेरियल की आवश्यकता होती है, और सबसे अधिक संभावना है कि पॉलिमॉर्फिज्म काम करने के लिए आवश्यक एक्सटेंशन (ऊपर वर्णित अनुसार) उपलब्ध न हों। अब उनकी गति को दूर करना मुश्किल है। Polymorphism के साथ एक समान कंटेनर निश्चित रूप से संभव है, storablevector पैकेज यह लागू करता है, लेकिन यह कहीं भी लोकप्रिय के करीब नहीं है।
क्या बाइटस्टर्स तत्वों पर किसी भी प्रतिबंध के बिना पॉलिमॉर्फिक हो सकता है? मुझे लगता है कि निकटतम हास्केल को यह ऐरे प्रकार है। यह निम्न स्तर के आईओ के लिए एक बाईस्ट्रिंग के रूप में उतना ही अच्छा नहीं है क्योंकि पॉइंटर से डेटा को सरणी के आंतरिक प्रारूप में अनपॅक करने की आवश्यकता है। इसके अलावा डेटा बॉक्स किया गया है, जो महत्वपूर्ण जगह ओवरहेड जोड़ता है। यदि आप अनबॉक्स किए गए संग्रहण (कम स्थान) और सी के साथ कुशल इंटरफेसिंग चाहते हैं, तो पॉइंटर्स जाने का तरीका हैं। एक बार आपके पास पीआरटी हो जाने के बाद, आपको स्टेलेबल की आवश्यकता होती है, और फिर आपको टाइप क्लास में तत्व प्रकार शामिल करने की आवश्यकता होती है, इसलिए आपको एक्सटेंशन की आवश्यकता होती है।
कहा जा रहा है कि, मुझे लगता है कि उपलब्ध उचित एक्सटेंशन के साथ यह अनिवार्य रूप से किसी एकल कंटेनर कार्यान्वयन (मॉड्यूलो म्यूटेबल/अपरिवर्तनीय एपीआई) के लिए एक हल समस्या है। कठिन हिस्सा अब कक्षाओं के एक समझदार सेट के साथ आ रहा है जो कई अलग-अलग प्रकार की संरचनाओं (सूचियों, सरणी, कतार आदि) के लिए प्रयोग योग्य हैं और उपयोगी होने के लिए पर्याप्त लचीला है। मैं व्यक्तिगत रूप से अपेक्षाकृत सीधा होने की उम्मीद करता हूं, लेकिन मैं गलत हो सकता था।
को यह जवाब आप व्याख्या कर सकते हैं कि आप इस काम की कल्पना? 'बाइटस्ट्रिंग' और '[]' दोनों के साथ एक प्रकार की कक्षा के लिए स्पष्ट रूप से संभव नहीं है, क्योंकि '[] 'के प्रकार' * -> * 'और' बाइटस्ट्रिंग' केवल '*' है। –
@ ट्रेविस ब्राउन: आप इसे एक छोटे से पैरामीटरयुक्त न्यूटाइप रैपर के साथ ऐसा कर सकते हैं। इसे कई बार पुनर्निर्मित किया गया है, लेकिन एक उदाहरण यहां है http://hackage.haskell.org/packages/archive/iteratee/0.2.1/doc/html/Data-Iteratee-WrappedByteString.html – Anthony
यदि कोई लाइब्रेरी है जो करता है आप क्या चाहते हैं, तो भाषा में उचित रूप से शामिल होने की आवश्यकता क्यों होगी? –