संक्षिप्त उत्तर यह है कि सही-सहयोगीता प्रोग्रामर प्रकार को वास्तव में क्या करता है इसके अनुरूप बनाते हुए पठनीयता में सुधार कर सकती है।
तो, यदि आप '1 :: 2 :: 3
' टाइप करते हैं, तो आपको पूरी तरह से अलग क्रम में सूची प्राप्त करने के बजाय, एक सूची (1, 2, 3) वापस मिलती है।
होगा ऐसा इसलिए है क्योंकि '1 :: 2 :: 3 :: Nil
' वास्तव में
List[Int].3.prepend(2).prepend(1)
scala> 1 :: 2 :: 3:: Nil
res0: List[Int] = List(1, 2, 3)
जो दोनों है:
- अधिक पठनीय
- अधिक कुशल (ओ (1)
prepend
के लिए, बनाम एन ओ() के लिए एक प्राक्कल्पित append
विधि)
(अनुस्मारक, Programming in Scala पुस्तक से निकालें)
यदि a * b
जैसे ऑपरेटर नोटेशन में कोई विधि उपयोग की जाती है, तो विधि को बाएं ऑपरेंड पर a.*(b)
में लागू किया जाता है - जब तक कि विधि का नाम कोलन में समाप्त न हो जाए।
यदि विधि का नाम एक कोलन में समाप्त होता है, तो विधि सही ऑपरेंड पर लागू की जाती है।
इसलिए, 1 :: twoThree
में, ::
विधि twoThree
पर लागू की गई है, इस तरह से 0: twoThree.::(1)
।
सूची के लिए, यह एक संलग्न आपरेशन की भूमिका (सूची जहां वास्तव में यह 1 जो है सूची में prepended है, के बाद '1' '1 2 3
' के रूप में संलग्न किया जा रहा है) निभाता है।
कक्षा सूची एक सच्चे परिशिष्ट संचालन की पेशकश नहीं करती है, क्योंकि सूची में शामिल होने में लगने वाला समय सूची के आकार के साथ रैखिक रूप से बढ़ता है, जबकि के साथ आगे बढ़ना :: निरंतर समय लेता है।
myList :: 1
'1' के लिए MyList की संपूर्ण सामग्री पहले जोड़ें करने की कोशिश करेगा, जो MyList को 1 prepending ('1 :: myList
' के रूप में)
नोट से अधिक समय होगा: कोई फर्क नहीं पड़ता एक ऑपरेटर संबद्धता है, हालांकि, इसकी ऑपरेटिंग हमेशा बाएं से दाएं का मूल्यांकन किया जाता है। अभी भी पहले मूल्यांकन किया जाता है
{ val x = a; b.:::(x) }
इस ब्लॉक एक में:
तो अगर ख एक अभिव्यक्ति है कि एक अपरिवर्तनीय मूल्य के लिए सिर्फ एक सरल संदर्भ है, तो एक ::: ख अधिक सटीक निम्नलिखित ब्लॉक के रूप में व्यवहार किया जाता है नहीं है बी, और उसके बाद इस मूल्यांकन का परिणाम बी के :: :: विधि के लिए एक ऑपरेंड के रूप में पारित किया गया है।
क्यों बनाना बिल्कुल बाएं साहचर्य और सही साहचर्य तरीकों के बीच अंतर?
एक सामान्य बाएं साहचर्य आपरेशन की उपस्थिति रखने के लिए अनुमति देता है कि ('1 :: myList
') वास्तव में सही अभिव्यक्ति पर आपरेशन लागू करते समय क्योंकि;
- यह अधिक कुशल है।
- लेकिन यह एक व्युत्क्रम साहचर्य आदेश के साथ अधिक पठनीय है ('
1 :: myList
' बनाम 'myList.prepend(1)
')
तो जैसा कि आप कहते हैं, "वाक्यात्मक चीनी", के रूप में तक मुझे पता है।
ध्यान दें, foldLeft
के मामले में, उदाहरण के लिए, वे gone a little to far ('/:
' सही-साहचर्य ऑपरेटर बराबर के साथ)
हो सकता है आपकी टिप्पणियों से कुछ में शामिल करने के लिए, थोड़ा rephrased:
यदि आप 'एपेंड' फ़ंक्शन पर विचार करते हैं, बाएं-सहयोगी, तो आप 'oneTwo append 3 append 4 append 5
' लिखेंगे।
हालांकि, अगर यह 3, 4, और 5 को एक दो में जोड़ना था (जिसे आप जिस तरह से लिखा है) मान लेंगे, तो यह ओ (एन) होगा।
'एपेंड' के लिए '::' के साथ ही होगा। लेकिन यह नहीं है। यह "आगे जोड़ते"
इसका मतलब है कि 'a :: b :: Nil
' के लिए वास्तव में है के लिए है 'List[].b.prepend(a)
'
यदि '::' पहले जोड़ें करने के लिए और अभी तक रहने के बाएं साहचर्य थे, तो जिसके परिणामस्वरूप सूची गलत क्रम में होगा ।
आप इसे सूची (1, 2, 3, 4, 5) वापस करने की उम्मीद करेंगे, लेकिन यह लौटने वाली सूची (5, 4, 3, 1, 2) को समाप्त कर देगा, जो प्रोग्रामर के लिए अप्रत्याशित हो सकता है।
है यही कारण है, क्योंकि तुमने क्या किया, हो गया होता बाएं साहचर्य क्रम में:
(1,2).prepend(3).prepend(4).prepend(5) : (5,4,3,1,2)
तो, राइट-संबद्धता कोड मैच वापसी मान के वास्तविक आदेश के साथ बनाता है।
कुछ उदाहरणों के साथ उन्हें आपके उत्तर में आपकी टिप्पणियां शामिल की गईं। – VonC
जहां तक मैं कह सकता हूं, यह लिस्प उपयोगकर्ताओं को घर पर महसूस करना है, पूरी तरह से :: सूची संलग्न ऑपरेशन की अनुमति देने के लिए। – skaffman
@ स्काफमैन नहीं, यह नहीं है। जवाब पढ़ें। –