2016-08-03 17 views
6

जहां तक ​​मैं इसे करता हूं, हाइपर ऑपरेटर »map() के लिए शॉर्टकट है। निम्नलिखित दो अलग-अलग परिणाम क्यों लौटाते हैं और दूसरे उदाहरण में .sum लागू नहीं किया जाता है?पर्ल 6 हाइपर »ऑपरेटर मानचित्र की तरह काम नहीं करता

say ([1,2], [2, 2], [3, 3]).map({.sum}); 
# (3 4 6) 
say ([1,2], [2, 2], [3, 3])».sum; 
# ([1 2] [2 2] [3 3]) 

उत्तर

6

हाइपरॉप्स उपन्यासियों में पुनरावर्ती रूप से उतरते हैं। इसके अलावा वे ऑटोथ्रेडिंग (एनवाईआई) के उम्मीदवार हैं जिसका मतलब है कि उनके परिचालन क्रम से बाहर हैं।

इसके अलावा https://github.com/rakudo/rakudo/commit/c8c27e93d618bdea7de3784575d867d9e7a2f6cb के साथ एक बग भी ठीक किया गया था।

say ([1,2], [2, 2], [3, 3])».sum; 
# (3 4 6) 
+2

यह सब सच है, लेकिन ध्यान दें कि हाइपर ऑपरेटर आवश्यक रूप से घटकों में नहीं उतरते हैं (सीएफ 'कहना ([1,2], [2, 2], [3, 3])» elems'); तर्कसंगत रूप से, 'List.sum' में सिर्फ' नोडल 'एनोटेशन की कमी है ... – Christoph

5

टी एल; डॉ आप लगभग निश्चित रूप से एक बग का सामना करना पड़ा है। उस ने कहा, map और » हाइपरोप में प्रमुख अंतर हैं।

mapSeq देता है। यह Seq पैदावार डेटा संरचना की आपूर्ति के लिए एक उपयोगकर्ता के तत्वों में से प्रत्येक के लिए उपयोगकर्ता की आपूर्ति कोड लागू करने के परिणाम:

  • एक स्तर गहरी (डेटा संरचना की ट्रेवर्सल उथला है - map रिकर्सिवली उप करने के लिए उतरना नहीं है एक समय में डेटा संरचना के शीर्ष स्तर)
  • एक के ढांचे (सब कुछ क्रमिक रूप से किया जाता है, समानांतर में कुछ भी नहीं है)
  • lazily (map रिटर्न तुरंत; उपयोगकर्ता की आपूर्ति कोड उपयोगकर्ता की आपूर्ति की डेटा संरचना बाद में परिणाम उत्पन्न करने के लिए लागू किया जाता है Seq से मूल्य खींचने के लिए आवश्यक)

» hyperop रिटर्न पर डेटा संरचना संकार्य, उसके बाईं पहला यह है कि डेटा संरचना के तत्वों के अपने अधिकार की पर एकल आपरेशन लागू करने के बाद:

  • केवल एक ही स्तर गहरी याleavesको उतरते जैसा कि यूनरी ऑपरेशन
  • समानांतर बैचों में, कम से कम अर्थात् (यह एक यूनरी ऑपरेशन चुनने के लिए प्रोग्रामर की ज़िम्मेदारी है जो पैरा में कई तत्वों पर लागू होने पर सही परिणाम देगा मनमाना क्रम में llel)
  • बेसब्री से (एक map कॉल के विपरीत, एक hyperoperation केवल लौटाता है जब एकल ऑपरेटर पूरे डेटा संरचना करने के लिए लागू किया गया है)

आप एक एकल ऑपरेटर कि है "nodal" (लागू कर रहे हैं इसलिए हाइपरपरेशन उतरने का विकल्प नहीं चुनता) या डेटा संरचना का संचालन केवल एक स्तर गहरा होता है (इसलिए उच्च रक्तचाप के लिए निम्न स्तर के पत्ते नहीं होते हैं) तो हाइपर ऑपरेशन और map के बीच अंतर एक यूनरी ऑपरेटर के साथ होते हैं अनुक्रमिक/समांतर और आलसी/उत्सुक पहलुओं।

यह मुझे बहुत स्पष्ट लगता है कि sum एक नोडल ऑपरेटर होना चाहिए अन्यथा यह उप-संरचनाओं में तब तक उतरेगा जब तक कि यह अलग-अलग पत्तियों पर न आए और इस प्रकार एकल मूल्यों के समूह पर लागू हो जाए जो व्यर्थ है। ईटीए: ऐसा लगता है कि यह अभी तय है।

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