2013-07-17 5 views
5

मुझे पता चला कि कुछ कंटेनरों के पास एक बहुत ही समान फ़ंक्शन सेट है। उदाहरण के लिए सूची, सेट, अनुक्रम, पाठ और बाइटस्टरीज़। मुझे आश्चर्य है कि वे एक या अधिक सामान्य टाइपक्लास का उपयोग क्यों नहीं करते हैं।कंटेनर-प्रकारों के लिए कोई टाइपक्लास क्यों नहीं है?

+1

असल में वे करते हैं। लेकिन "सामान्य टाइपक्लास" की सूची आम तौर पर 'मोनॉयड ',' फंक्टर 'और कभी-कभी' लिस्टलाइक 'तक ही सीमित होती है। मुझे लगता है कि ऐसा इसलिए है क्योंकि अन्य वर्ग मौजूद नहीं हैं या पर्याप्त आम नहीं हैं। – Yuras

+3

वैसे, लाइब्रेरी के लिए 'लेंस' पैकेज को देखें, जिसने उन सभी पर सारण करने का तरीका खोज लिया है। लेकिन यह नए टाइपक्लास के साथ ऐसा नहीं करता है, जिस तरह से आप सोच सकते हैं .. – Carl

+2

@ युरास - कंटेनरों को ट्रैवर्सबल और फोल्डबल का समर्थन करना चाहिए (या ऐसा करने का कोई अच्छा कारण नहीं है)। –

उत्तर

7

वास्तव में, प्रश्न Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations) देखें, जो आपके लगभग एक डुप्लिकेट है।

एक अलग पैकेज में होने का मुख्य कारण शायद यह है कि इसे भाषा विस्तार की आवश्यकता है - या तो कार्यात्मक निर्भरताएं या परिवारों को टाइप करें। हमें किसी भी तरह कहना है कि Text में केवल Char एस, ByteString हो सकता है केवल Word8 एस, [] में कोई भी प्रकार हो सकता है, और Set में केवल Ord के उदाहरण हो सकते हैं। सूची की तरह

9

उनके पास क्या सामान्य कार्य सेट है? AFAICS, केवल एक ही कंटेनर को एक में जोड़ने और खाली कंटेनर उत्पन्न करने की क्षमता। और देखो, वास्तव में वे सभी Monoid हैं, जो वास्तव में उस इंटरफेस की पेशकश करता है!

आप इनमें से सभी के साथ वास्तव में कुछ भी नहीं कर सकते हैं क्योंकि कुछ पॉलिमॉर्फिक हैं, कुछ मोनोमोर्फिक हैं।

3

बहुरूपी कंटेनर, Sequence, Maybe और MapFunctor, Foldable और Traversable typeclasses के उदाहरण हैं।

Set के लिए आप केवल Foldable है, के रूप में Ord उदाहरण यह असंभव दूसरों को परिभाषित करने के लिए बनाता है (आप fmap (Data.Set.map परिभाषित कर सकते हैं), जो functor कानूनों का पालन करना होगा, लेकिन यह हस्ताक्षर तर्क पर Ord उदाहरणों की आवश्यकता होगी है)।

जैसा कि पहले बताया गया है, टेक्स्ट और बाइटस्ट्रिंग परिभाषित समान प्रकार के वर्गों के उदाहरण हो सकते हैं, लेकिन आपको या तो कार्यात्मक निर्भरताओं या परिवारों को टाइप करने की आवश्यकता होगी।

+0

[सेट _is_ monoid] (http://hackage.haskell.org/packages/archive/containers/0.5.2.1/doc/html/src/Data-Set-Base.html#line-231): उस कक्षा के बाद से उदाहरण के सिर में कोई बहुलक कार्य/निहित प्रकार तय नहीं होता है, यह वहां एक मोनोमोर्फिक कंटेनर के रूप में व्यवहार करता है। - संयोग से, यहां तक ​​कि एक चालाक तरीका भी है जिसमें आप इसे [फ़ैक्टर/आवेदक/मोनाड] बना सकते हैं (http://copilotco.com/mail-archives/haskell-cafe.2007/msg00051.html), साथ ही; जिसके लिए एक GADT में 'Ord' उदाहरण बाध्यकारी की आवश्यकता होती है। – leftaroundabout

+0

सच, अच्छा बिंदु। – phadej

+1

सेट और फ़ंक्शन के बारे में अधिक जानकारी: http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunctors/ – phadej

संबंधित मुद्दे