2011-05-13 15 views
5

में == और = के बीच अंतर मुझे अभी भी == और = के बीच हास्केल में अंतर के आसपास अपना सिर प्राप्त करने में परेशानी है। मुझे पता है कि पूर्व में ओवरलोडेड प्रकार होने के साथ कुछ करना है और बाद वाला 'फ़ंक्शन का परिणाम देता है' लेकिन मुझे लगता है कि मैं इसके चारों ओर अपना सिर नहीं ढूंढ पा रहा हूं! कोई भी सहायताकाफी प्रशंसनीय होगी।Haskell

+0

ध्यान दें कि कई भाषाओं ही नहीं, हास्केल, थोड़ा इन ऑपरेटरों के लिए परिभाषाएँ अलग है नहीं है ।विशेष रूप से, एरलांग, उन स्थानों पर '=' का उपयोग करता है जहां अधिकांश अन्य भाषाएं '== ' –

उत्तर

15

= हास्केल में एक विशेष आरक्षित प्रतीक जिसका अर्थ है 'के रूप में परिभाषित किया गया है "है। इसका उपयोग परिभाषाओं को पेश करने के लिए किया जाता है। यही है, आप इसे नए मूल्यों और कार्यों को बनाने के लिए उपयोग करते हैं जिन्हें अन्य मूल्यों और कार्यों की परिभाषाओं में संदर्भित किया जा सकता है।

== एक आरक्षित प्रतीक नहीं है, लेकिन Eq a => a -> a -> Bool प्रकार का एक रन-ऑफ-द-मिल फ़ंक्शन है। यह type class (Eq) में घोषित किया जाता है, लेकिन इसके बारे में असाधारण कुछ भी नहीं है। आप == की अंतर्निहित घोषणा को छुपा सकते हैं और जो कुछ भी आप चाहते थे उसे फिर से परिभाषित कर सकते हैं। लेकिन आम तौर पर इसका मतलब है "बराबर है", और क्योंकि यह एक प्रकार की कक्षा का हिस्सा है, इसलिए आप इसे "समानता" को परिभाषित कर सकते हैं जिसका अर्थ है कि आप अपने विशेष प्रकार के लिए "समानता" का अर्थ लेना चाहते हैं।

उदाहरण के लिए:

data Foo = Foo Int 

instance Eq Foo where 
    (Foo x) == (Foo y) = x == y 

ध्यान दें कि मैं = इस्तेमाल किया Foo के लिए == परिभाषित करने के लिए!

एक सारगर्भित अंतर के बारे में सोचना तरीका है कि =दावा संकलन समय पर समानता, जबकि रनटाइम पर समानता के लिए ==चेकों है।

1

== समानता के लिए

उदाहरण है: की तुलना दो पूर्णांकों

= काम

है उदाहरण: एक चर

+5

का उपयोग करती हैं, मैं" असाइनमेंट "पर" परिभाषा "शब्द का उपयोग करूंगा। 'x = 4' का अर्थ है" x को 4 होना परिभाषित किया गया है "। यह मायने रखता है क्योंकि असाइनमेंट का तात्पर्य है कि यह महत्वपूर्ण है * जब * ऐसा होता है, जो यह नहीं करता है। – luqui

1

मैं अभी तक नहीं कर रहा हूँ काफी हास्केल विशेषज्ञ करने के लिए एक पूर्णांक बताए , लेकिन अधिकांश अन्य भाषाओं में == एक तुलना ऑपरेटर true या false उपज है, जबकि = असाइनमेंट ऑपरेटर है, जो हास्केल में उबलता है समारोह घोषणा

ghci> 5 == 5 
true 
ghci> "foo" == "bar" 
false 
ghci> let foo = "bar" 
1

== दो चीजें बराबर होने की तुलना करने के लिए एक ऑपरेटर है। यह "सामान्य ए => ए -> ए -> बूल" प्रकार के साथ काफी सामान्य हैकेल फ़ंक्शन है। प्रकार बताता है कि यह प्रत्येक प्रकार के मान पर काम करता है जो ईक टाइपक्लास लागू करता है, इसलिए यह ओवरलोडेड है।

= दूसरी ओर एक असाइनमेंट ऑपरेटर है, जिसका उपयोग परिभाषाओं को पेश करने के लिए किया जाता है।

2

= असाइनमेंट करता है। या परिभाषा शायद एक बेहतर शब्द है। केवल एक बार कर सकते हैं। यह एक विशेष ऑपरेटर/प्रतीक है। यह एक समारोह

== एक समारोह है, आमतौर पर infixed, कि typeclass Eq के दो आदानों लेता है और एक bool रिटर्न

Prelude> let a = 1 
Prelude> a 
1 
Prelude> 5 == 5 
True 
Prelude> 5 == 6 
False 
Prelude> :t (==) 
(==) :: (Eq a) => a -> a -> Bool