2017-09-12 8 views
5

यह मेरे वर्तमान कोड का एक उदाहरण है:क्या एरलांग में एक सूची में छुपे हुए रोउनम हैं?

DataSet = [1,2,3,4,5,6,7,8,9]. 

Sequence = [3,4,5,6]. 

ReducedDataSet = lists:foldl(fun(SeqNumber, Output) -> 
           Row = lists:nth(SeqNumber, DataSet), 
           [Row|Output] 
           end, 
           [], 
           Sequence 
          ). 

ReducedDataSet के रूप में समाप्त होता है [6,5,4,3] और अगर मैं इस सूची में दर्ज बदलने के लिए: foldr, ReducedDataSet होगा [3,4,5 , 6]।

मैं इस उम्मीद नहीं थी के रूप में जब बाएं से दाएं अवशोषित 3 मान 3 और 6 के लिए आगे बढ़ना चाहिए, लेकिन जब दाएं से बाएं अवशोषित, 3 मूल्य 7 होगा, और 4.

के लिए आगे बढ़ें

क्या इसका मतलब है कि मेरी सूची में एक छिपी हुई पंक्ति संख्या है, और फ़ोल्ड और फ़ोल्डर केवल अंतिम सूची के क्रम क्रम में भिन्न है?

उत्तर

4

टी एल कहलाता है; डॉ

नहीं, एरलांग सूची में कोई छिपी हुई अनुक्रमणिका या "पंक्ति संख्या" नहीं है।

चर्चा

यह के कार्यात्मक सूचियों के संदर्भ में सूची संचालन की प्रकृति में थोड़ा और अधिक पता लगाने के लिए सहायक हो सकता है विभिन्न प्रकार के "सूचियों conses का एक समूह है।"

मैं परतों का एक विवरण एक समय पहले कि आप के लिए उपयोगी हो सकता है लिखा है: Explanation of lists:fold function

ध्यान रखें कार्यात्मक सूचियों केवल संकेत दिए गए कि जाना एक तरह से है। यही है, वे अकेले लिंक्ड सूचियां हैं। "राउनम" या "इंडेक्स" की कोई अवधारणा नहीं है क्योंकि यह सी शैली सरणी में होगी। lists:nth/2 पर प्रत्येक कॉल वास्तव में को उस तत्व को वापस करने से पहले n वें तत्व की सूची को घुमाता है।

हम lists:nth/2 इस प्रकार लिख सकते हम एक संस्करण है कि बुरा इनपुट पर दुर्घटनाओं चाहते हैं (और, यह देख ऊपर है, यह है कि it is written almost exactly like this पता चला है):

nth(1, [Element | _]) -> 
    Element; 
nth(N, [_ | Rest]) when N > 1 -> 
    lists:nth(N - 1, Rest). 

(एक तरफ ध्यान दें के रूप में, not inlining funs that require you to write multi-line definitions as function arguments पर विचार करें। ..)

+0

सोचें कि यह मेरे प्रश्न का उत्तर सबसे अच्छा है जैसा मैंने पूछा था। दूसरा जवाब गुना पर एक अच्छा त्वरित अनुस्मारक है, लेकिन जैसा कि मैंने स्वयं महसूस किया था, जवाब याद रखना था कि यह सूचियां थीं: एनएच जो सूची में स्थिति निर्धारित कर रहा था। – Philbo

+0

मैं इस बात का भी प्रशंसक नहीं हूं कि हम वर्तमान में बहु-पंक्ति कार्यों को कैसे लिख रहे हैं - मैंने इसे ऊपर कैसे लिखा है, यह दर्शाता है कि हम वर्तमान में इसे कैसे कर रहे हैं। अपने लिंक को मेरे सीनियर को बाद में भेजने के लिए, देखें कि क्या यह प्रबंधित करने के मुकाबले यह एक और अधिक तर्कसंगत तर्क बनाता है। – Philbo

+0

@ फिलिबो हर कोई मेरे साथ सहमत नहीं है कि चीजों को विघटित करना एक अच्छा विचार है। मैंने पाया है कि बहुत ही अच्छी तरह से नामित फ़ंक्शंस इनलाइन मज़े से अधिक आसानी से निपटने के लिए आसान होते हैं (और कहीं और पुन: उपयोग करते हैं), और लगभग सभी मामलों में एक बड़े फ़ंक्शन के भीतर किसी अन्यथा अज्ञात फ़ंक्शन को सार्थक लेबल असाइन करना लगभग हमेशा एक पठनीयता जीत होता है। उन पठनीयता * वास्तव में * समय के साथ जोड़ते हैं, हालांकि, विशेष रूप से जब आप कुछ पुराने कोड को फिर से काम करने के लिए वापस जाते हैं। सामान्य शैली के लिए, मैंने उस उद्देश्य के लिए उपलब्ध ग्रेबीर्ड सलाह के आधार पर एक उदाहरण प्रोजेक्ट लिखा: https://github.com/zxq9/zuuid – zxq9

4

मुझे लगता है कि यह एक सामान्य सामान्य fold प्रश्न है। (new_element, acc) -> new_acc

तो आपरेशन new_element ° acc विनिमेय है (उदाहरण के लिए sum), foldl और foldr ही कर रहे हैं:

सामान्य तौर पर, गुना निम्नलिखित प्रदर्शन करती है।

यदि ऑपरेशन "संलग्न" है तो तत्व को बाईं ओर दाईं ओर जोड़ने के बीच एक अंतर है।

[3] ° 4 -> [3, 4] वी.एस. 4 ° [3] -> [4, 3]

मुझे याद है कभी नहीं जो है foldl और foldr लेकिन मुझे लगता है बायीं/दायीं संचायक की स्थिति ([3] ° 4 इस परिभाषा के साथ foldl है)

+2

ईमानदार होने के लिए, आपके उत्तर के साथ मुझे एहसास हुआ है कि मैं यहां गलत चीज़ पर ध्यान केंद्रित कर रहा हूं।जैसा कि आप कहते हैं कि फोल्ड और फ़ोल्डर एक संचित नई सूची में जोड़े गए तत्वों की स्थिति का निर्धारण कर रहे हैं, इसकी सूचियां: nth जो स्थैतिक मूल डेटासेट का उपयोग कर रहा है और प्रत्येक स्थिति निर्धारित कर रहा है। सूचियों के लिए: nth, तीसरा तत्व हमेशा तीसरे स्थान पर होता है, भले ही मैं इसे प्राप्त करने के बाद उस तत्व के साथ क्या करता हूं। – Philbo

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