2009-12-29 13 views
18

में समानता की क्षमता मेरे पास एक ऐसा फ़ंक्शन है जो डेटा लेता है और या तो एक ही डेटा या थोड़ा संशोधित संस्करण देता है।हास्केल

मैं अपना प्रोग्राम एक चीज करना चाहता हूं अगर यह बदल गया हो या दूसरी चीज अगर यह नहीं बदली।

पहले मैं एक जोड़ी (Bool,Object) लौटा रहा था और यह देखने के लिए fst का उपयोग कर रहा था या नहीं। हाल ही में यह मेरे लिए हुआ कि मैं ऑब्जेक्ट को वापस करके और == का उपयोग करके समानता की जांच करके कोड को सरल बना सकता हूं।

लेकिन फिर मुझे एहसास हुआ कि हास्केल गहरी समानता जांच और "ऑब्जेक्ट पहचान" (यानी, पॉइंटर समानता) के बीच अंतर नहीं करता है। तो मैं कैसे जान सकता हूं कि == का उपयोग कुशल या नहीं होगा? क्या मुझे दक्षता कारणों से बचाना चाहिए, या ऐसे मामले हैं जहां मैं संकलक पर निर्भर कर सकता हूं कि यह गहरा समानता जांच करने की आवश्यकता नहीं है?

आम तौर पर मैं प्रारंभिक कार्यक्रम लिखते समय दक्षता के बारे में चिंतित नहीं होता, लेकिन यह मेरे मॉड्यूल में इंटरफ़ेस को प्रभावित करता है, इसलिए मैं इसे बहुत अधिक कोड लिखने से पहले ठीक करना चाहता हूं, और यह इसके लायक नहीं है केवल कोड के एक छोटे टुकड़े के लिए कार्यक्रम को बहुत कम कुशल बनाते हैं। इसके अलावा, मैं एक बेहतर विचार प्राप्त करना चाहता हूं कि जीएचसी पर मुझे किस तरह के अनुकूलन पर निर्भर किया जा सकता है।

+12

बस एक नोट के रूप में, यह किसी भी 'या तो' मूल्य या कुछ समकक्ष के लिए एक बेहतर मामला जैसा लगता है लेकिन अधिक अर्थपूर्ण (उदा। 'डेटा चेंजस्टेट ए = वही ए | बदल गया ए')। – Chuck

+0

कोई बुरा विचार नहीं, ध्यान दिया। – Steve

उत्तर

34

अनिश्चित संकलक अनुकूलन पर भरोसा करना हमेशा एक बुरा विचार है, ताकि निरंतर समय समानता बनाम रैखिक-समय गहरी समानता के रूप में ऐसी महत्वपूर्ण प्रदर्शन गारंटी प्रदान की जा सके। आप एक नए प्रकार के साथ बहुत बेहतर हैं जो मूल्य के बारे में जानकारी को समेकित करता है या नहीं, यह मान नया है या नहीं। आपके आवेदन पर निर्भर करता है हो सकता है या तो

data Changed a = Changed a | Unchanged a 

या

data Changed a = Changed a | Unchanged 

हम वास्तव में ग्लासगो हास्केल कंपाइलर के अंदर एक समान प्रकार उपयोग करती हैं इसलिए हम अनुकूलक चल रहा जब तक कोड बदल रहा है बंद हो जाता है रख सकते हैं। जब तक परिणाम बदलना बंद नहीं हो जाता तब तक हम पुनरावृत्त डेटाफ्लो विश्लेषण भी चलाते हैं।

हमें यह प्रकार एक मोनैड बनाने में उपयोगी लगता है ताकि हम do नोटेशन का उपयोग करके कुछ सरल उच्च-आदेश फ़ंक्शन लिख सकें, लेकिन यह आवश्यक नहीं है — बस एक सुविधा।

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

+0

धन्यवाद, यह एक सुंदर ठोस उत्तर की तरह लगता है। – Steve

+3

मुझे आश्चर्य है कि यह एक मोनड के रूप में कैसे काम करता है? दूसरा संस्करण 'हो सकता है' मोनड जैसा लगता है। हालांकि 'शायद' के विपरीत, यहां आप अंतिम अपरिवर्तित परिणाम चाहते हैं, न केवल यह जानकर कि यह बाद में 'अपरिवर्तित' था। – yairchu

+0

@yairchu यह अभी भी शायद मोनड के समान अस्पष्ट है। यदि मोनैडिक संरचना के साथ कहीं भी "बदल गया" है तो परिणाम "कुछ बदल गया" है, अन्यथा यह "अपरिवर्तित कुछ" है –

1

मैं अभी भी एक रिश्तेदार हैकेल नोब हूं, इसलिए मेरा जवाब नमक के एक ग्रैन के साथ लें, और कृपया मुझे माफ़ कर दो अगर मेरा जवाब उतना प्रत्यक्ष नहीं है जितना होना चाहिए!

हास्केल में, ऑपरेटर विशेष नहीं हैं - वे सिर्फ इंफिक्स फ़ंक्शन हैं।

आप मानक प्रलोभन में definition of the equality operator स्वयं को देख सकते हैं।

बेशक, इसे आपके द्वारा परिभाषित किए गए डेटा प्रकार के साथ काम करने के लिए अधिभारित किया जा सकता है - लेकिन यदि आप ओवरलोडिंग करते हैं, तो आप जान लेंगे कि कार्यान्वयन कितना कुशल है।

यह जानना उपयोगी हो सकता है कि आप Hoogle का उपयोग फ़ंक्शन परिभाषा को ढूंढने के लिए कर सकते हैं। इस तरह मुझे समानता ऑपरेटर की परिभाषा मिली।

+0

इस पोस्ट को देखने के लायक भी: http://stackoverflow.com/questions/1717553/pointer-equality-in-haskell – nont

4

व्युत्पन्न (==) हमेशा गहरी तुलना होती है। आपका प्रश्न हैकेल-कैफे पर discussed रहा है।