2011-09-26 17 views
15

क्या कोई ऐसा व्यक्ति है जो मुझे समझा सकता है कि Set डेटास्पेप हास्केल में परिभाषित क्यों नहीं है?हास्केल में कोई अंतर्निहित सेट डेटा प्रकार क्यों नहीं है?

सिडेनोटे: मैं केवल तर्क पर एक कोर्स के हिस्से के रूप में हास्केल सीख रहा हूं जिसमें सेट सिद्धांत बहुत महत्वपूर्ण है, इसलिए हास्केल में एक सेट की धारणा वास्तव में आसान होगी। एक सूची होने और डुप्लीकेट (और संभवतः सॉर्टिंग) को हटाने के परिणामस्वरूप एक सेट भी होगा, लेकिन अगर कोई विशेष कारण है कि यह अंतर्निहित क्यों नहीं है तो मैं उत्सुक हूं?

+3

** मॉडरेटर नोट ** इस प्रश्न के तहत टिप्पणियां अधिकतर शोर, या शोर की प्रतिक्रिया थीं और उन्हें हटा दिया गया है। कृपया टिप्पणीत्मक और विषय पर टिप्पणियां रखें। –

+0

मुझे इसके बजाय सूचियों के उपयोग का सुझाव देने वाले उत्तरों/टिप्पणियां दिखाई देती हैं। एक सूची सेट के लिए एक कुशल प्रतिस्थापन नहीं है। एक अनियंत्रित सूची में तत्व ढूंढने का समय सूची के आकार के साथ बढ़ता है, एक सेट में, स्थिर होने की उम्मीद है। – ribamar

उत्तर

26

जैसा कि अन्य उत्तरों इंगित करते हैं, सवाल "हास्केल में कोई सेट डेटा प्रकार क्यों नहीं है?" गुमराह किया गया है: there is a Set data type

यदि आप जानना चाहते हैं कि क्यों Set हास्केल में "अंतर्निहित" नहीं है, तो आप दो चीजों में से एक से पूछ सकते हैं।

  • Setlanguage specification का हिस्सा क्यों नहीं है?
  • SetPrelude में नहीं है (डिफ़ॉल्ट रूप से आयात किए गए फ़ंक्शंस और डेटा प्रकार)?

पूर्व उत्तर देने के लिए ऐसा इसलिए है क्योंकि भाषा में इसे बेक करने की जरूरत के बिना एक संग्रह के विचार व्यक्त करते हैं। कार्यात्मक प्रोग्रामिंग पर एक उच्च जोर, tuples और सूचियों के लिए विशेष सिंटेक्स के साथ एक भाषा होने के नाते पर्याप्त शक्तिशाली है में बनाया गया है, लेकिन Bool जैसे सरल डेटा प्रकार प्रीलूड में परिभाषित किए गए हैं।

बाद में जवाब देने के लिए, फिर से, कार्यात्मक प्रोग्रामिंग पर जोर देने के साथ, अधिकांश हास्केलर सूचियों का उपयोग करते हैं। सूची मोनड नोडेटर्मेनिस्टिक विकल्प का प्रतिनिधित्व करता है, और डुप्लिकेट की अनुमति देकर, आप भारित विकल्पों का प्रतिनिधित्व कर सकते हैं।

नोट how similar list comprehension syntax is to set notation। यदि आवश्यक हो तो सूची को "वास्तविक" सेट में बदलने के लिए आप हमेशा Set.fromList का उपयोग कर सकते हैं। बैरी के लिए चिल्लाने के रूप में, यह पाइथन की set() विधि का उपयोग करने के समान होगा; पायथन में भी सूची की समझ है।

+0

तकनीकी रूप से, 'डेटा.सेट' जीएचसी में है, लेकिन यह हैकेल 98 या 2010 में – user102008

+0

@ उपयोगकर्ता 102008 "जीएचसी में" रिपोर्ट नहीं है? यह [कंटेनर पैकेज] में है (http://hackage.haskell.org/package/containers), जिसे [हास्केल प्लेटफ़ॉर्म] (http://hackage.haskell.org/platform/) के साथ शामिल किया गया है, लेकिन मैं ' मुझे यकीन नहीं है कि यह "जीएचसी में" कहकर आपका क्या मतलब है। –

+0

@ डैनबर्टन अच्छी तरह से, 'कंटेनर' पैकेज _ships_ जीएचसी के साथ, भले ही आपको प्लेटफ़ॉर्म न मिले। – ivanm

9

यह Data.Set के रूप में मौजूद है। हालांकि, जैसा कि आपने कहा था, इसे list के शीर्ष पर कार्यान्वित किया जा सकता है और इसलिए आवश्यक ऐसी भाषा का निर्माण करने के लिए नहीं है, जो मुझे लगता है कि यह भाषा की परिभाषा का हिस्सा होने के बजाय मॉड्यूल में क्यों है।

+0

खैर, सूचियों को अन्य चीजों का भी उपयोग करके परिभाषित किया जा सकता है ... –

+0

@DietrichEpp हां, लेकिन अगर आप सूची की एक स्पष्ट श्रृंखला के रूप में सूची लिखने के लिए जोड़ते हैं तो वाक्यविन्यास वास्तव में भारी होगा। – mb14

+1

@ mb14 '(:) == विपक्ष; स्पष्ट सीमित सूचियों के लिए सिंटैक्टिक चीनी है और विभिन्न 'enum {from} {Then} {to} 'कार्यों के आसपास रैपर के रूप में है। – ivanm

11

एक और दार्शनिक स्तर पर --- एक सेट की गणितीय अवधारणा और हास्केल सेट कार्यान्वयन के बीच कभी सख्त पत्राचार नहीं हो सकता है। क्यों नहीं? खैर, स्टार्टर्स के लिए टाइप सिस्टम। एक गणितीय सेट में कुछ भी हो सकता है: {x | x is a positive integer, i < 15} एक सेट है, लेकिन {1, tree, ham sandwich} है। हास्केल में, Set a को कुछ विशेष प्रकार रखने की आवश्यकता होगी। एक ही सेट में डबल्स और फ्लोट्स डालने से टाइपशेक नहीं होगा।

जैसा कि अन्य ने कहा है, अगर आपको कुछ सेट जैसी चीजें करने की आवश्यकता है और टाइप प्रतिबंध को ध्यान में रखें, तो डेटासेट मौजूद है। यह प्रीलूड में नहीं है क्योंकि सूचियां आम तौर पर अधिक व्यावहारिक होती हैं। लेकिन वास्तव में, एक भाषा डिजाइन परिप्रेक्ष्य से, गणितीय सेटों को कई लोगों के बीच एक डेटाटाइप के रूप में सोचने का अर्थ नहीं है। सेट उससे अधिक मौलिक हैं। आपके पास सेट, और संख्याएं और सूचियां नहीं हैं; आपके पास संख्याओं और सूचियों के सेट हैं। पुनरावर्ती प्रकारों की शक्ति उस भेद को अस्पष्ट करती है, लेकिन यह अभी भी असली है।

हास्केल में एक जगह है, हालांकि, जहां हम मनमाने ढंग से संग्रह परिभाषित करते हैं, और फिर उन संग्रहों पर कार्यों को परिभाषित करते हैं। हास्केल में सेट की गणितीय अवधारणा का सबसे नज़दीकी एनालॉग सिस्टम सिस्टम ही है।

+1

कई बार, गणित में सेट एक "ब्रह्मांड" के संदर्भ में विचार किया जाता है (http://en.wikipedia.org/wiki/Universe_(mathematics)) – user102008

+0

@Zopa: आप अभी भी व्यक्त कर सकते हैं एक sum- का उपयोग कर कि प्रकार। – ivanm

+0

यह सच है, जैसा कि आप कहते हैं, "हास्केल में, 'सेट ए' को कुछ विशेष प्रकार रखने की आवश्यकता होगी"। लेकिन जिस प्रकार 'ए' को तत्काल किया गया है, वह अस्तित्वहीन प्रकार हो सकता है, जिसमें से '1',' पेड़ 'और' हैम सैंडविच 'बहुत अच्छे सदस्य हो सकते हैं, मानते हैं कि' पेड़ 'और' हैम सैंडविच 'स्वयं अच्छी तरह से टाइप किए गए हैं शर्तें ... आप इस तरह के सेट के साथ अर्थपूर्ण तरीके से क्या कर सकते हैं मुझे कोई जानकारी नहीं है;) हालांकि मैं आपके निष्कर्ष से सहमत हूं कि _types self_ सबसे नज़दीकी चीज है जो हास्केल को सेट की गणितीय धारणा है। –

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