कार्यात्मक प्रोग्रामिंग में अंतर सूची


14

प्रश्न ओकासाकी के बाद से विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं में नया क्या है? , और jbapple के महाकाव्य उत्तर, कार्यात्मक प्रोग्रामिंग में अंतर सूचियों (तर्क प्रोग्रामिंग के विपरीत) का उपयोग करते हुए उल्लेख किया गया है, जो कि हाल ही में मेरी दिलचस्पी है, इसने मुझे हास्केल के लिए अंतर सूची कार्यान्वयन का पता लगाने का नेतृत्व किया । मेरे दो प्रश्न हैं (मुझे माफ कर दो / यदि मैं उन्हें StackExchange पर दो अलग-अलग प्रश्न कर दूं)।

सरल प्रश्न है, क्या किसी को हास्केल पुस्तकालय में एक के अलावा कार्यात्मक प्रोग्रामिंग और / या कार्यान्वयन में अंतर सूचियों के अकादमिक विचार के बारे में पता है? jbapple के उत्तर में अंतर सूचियों के लिए प्रशस्ति पत्र नहीं दिया गया था (तर्क प्रोग्रामिंग में अंतर सूचियां विद्या में मौजूद हैं और कुछ स्रोतों में जो मेरे पास इधर कहीं है (टीएम))। हास्केल कार्यान्वयन को खोजने से पहले मुझे पता नहीं था कि यह विचार तर्क से कार्यात्मक प्रोग्रामिंग तक उछला था। दी गई, हास्केल अंतर सूची उच्च-क्रम के कार्यों के प्राकृतिक उपयोग के कुछ हैं और तर्क प्रोग्रामिंग में लोगों से काफी अलग काम करते हैं, लेकिन इंटरफ़ेस निश्चित रूप से समान है।

जितनी दिलचस्प (और दूर तक फ़ेज़ियर की अध्यक्षता वाली) बात मैं पूछना चाहता था कि क्या उक्त हास्केल अंतर सूची पुस्तकालय के लिए दावा किया गया एसिम्प्टोटिक ऊपरी सही / प्रशंसनीय है। मेरा भ्रम हो सकता है क्योंकि मैं आलस्य के साथ तर्क की जटिलता के बारे में स्पष्ट रूप से कुछ याद कर रहा हूं, लेकिन दावा किया सीमा केवल मेरे लिए समझ में आता है अगर एक बड़े डेटा संरचना (या बंद करने, या चर देखने, या कुछ ) पर प्रतिस्थापन हमेशा निरंतर समय लेता है। या "कैच" बस इतना है कि "हेड" और "टेल" के लिए रनिंग टाइम पर कोई बाध्य नहीं है, क्योंकि उन ऑपरेशनों को आस्थगित संगणना / प्रतिस्थापन के एक मनमाने ढेर के माध्यम से हल करना पड़ सकता है?


1
पहले तो मैं "कार्यात्मक प्रोग्रामिंग भाषाओं (कार्यात्मक प्रोग्रामिंग भाषाओं के विपरीत)" से भ्रमित था, लेकिन क्या आपको "तर्क प्रोग्रामिंग भाषाओं के विपरीत" लिखने का मतलब था?
त्सुयोशी इतो

ओह उफ़ - हाँ, यही मेरा मतलब है, यह अब तय हो गया है।
रोब सिमंस

दूसरा सवाल मेरे लिए स्टैक ओवरफ्लो पर अधिक उपयुक्त लगता है लेकिन, अब जब आपने इसे यहां पूछ लिया है, तो यह देखने के लिए इंतजार करना बेहतर हो सकता है कि कोई यहां जवाब दे सकता है या नहीं। व्यक्तिगत रूप से मुझे स्रोत कोड को पढ़ने से दावा की गई सीमाओं पर संदेह करने का कोई कारण नहीं मिल सकता है, लेकिन मैंने उन्हें संदेह करने के आपके तर्क का पालन नहीं किया है, और यह भी कि मुझे कुछ याद आ रहा है।
त्सुयोशी इटो

जवाबों:


9

या "कैच" बस इतना है कि "हेड" और "टेल" के लिए रनिंग टाइम पर कोई बाध्य नहीं है, क्योंकि उन ऑपरेशनों को आस्थगित संगणना / प्रतिस्थापन के एक मनमाने ढेर के माध्यम से हल करना पड़ सकता है?

मुझे लगता है कि यह कमोबेश सही है। डीएल का वास्तव में केवल तेजी से निर्माण कार्य होता है, हालाँकि, जुताई , जहाँ , DL बनाने के लिए उपयोग किए जाने वाले संचालन की संख्या है।मीटरΘ(m)m

आवश्यक कार्यों में से कुछ के निम्नलिखित रक्षात्मक संस्करण को लिए आलस्य की आवश्यकता होती है , लेकिन अन्यथा मूल में दावा किए गए जटिलता की सीमाओं को समझने का एक सीधा तरीका होना चाहिए ।O(1) fromList

{-# LANGUAGE NoMonomorphismRestriction #-}

data DL a = Id
          | Cons a
          | Compose (DL a) (DL a)

fromList [] = Id
fromList (x:xs) = Compose (Cons x) (fromList xs)

toList x = help x []
    where help Id r = r
          help (Cons a) r = a:r
          help (Compose f g) r = help f $ help g r

empty = Id

singleton = Cons

cons x = append (singleton x)

append = Compose

snoc xs x = append xs (singleton x)

के संचालन और के रूप में वे कर रहे हैं उसी तरह लागू किया जा सकता संस्करण का उपयोग कर ।Θ(n)headtail[a] -> [a]toList


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

@ रोब, मुझे समझ नहीं आ रहा है कि आपका क्या मतलब है।
जाप्‍पल

मुझे लगता है कि जिस बिंदु को मैं (बुरी तरह से) बनाने की कोशिश कर रहा था, उसका उदाहरण इस उदाहरण से मिलता है: मेरे पास असाधारण रूप से लंबी अंतर सूची "xs" है जिसे मैंने बार-बार "स्नोक" द्वारा बनाई गई चीजों को मूल सूची में शामिल किया है। पहली बार जब मैं "हेड एक्स" कहता हूं, तो मुझे उम्मीद है कि स्थगित गणना करने में ओ (एन) समय लगेगा; हालाँकि, क्योंकि उस गणना को याद किया जाना चाहिए, "हेड एक्स" के लिए दूसरा कॉल ( उसी "एक्सएस" के लिए) ओ (1) समय लेना चाहिए।
रोब सिमंस

1
ठीक है, मैं इससे सहमत हूं, लेकिन मेरे जवाब में मैंने जो आलस्य का हवाला दिया, वह एलिस्टिस्ट के बारे में था, जिसका उपयोग स्नोक या सिर में नहीं किया जाता है। तो, जैसा कि, पांडित्य, जैसा कि है, मैं आपके कथन "क्या आप आलस्य से प्राप्त कर रहे हैं" में "क्या" से भ्रमित था। मैं कहता हूं कि आपका उदाहरण और मेरा दो चीजें हैं जो आपको आलस्य से मिल रही हैं।
jbapple

ठीक है - और यह स्पष्टीकरण मुझे आपके पहले के बिंदु को बेहतर समझने में मदद करता है, साथ ही साथ।
रोब सिमंस

12

हां, सीमा इस धारणा पर निर्भर करती है कि फ़ंक्शन रचना को निरंतर समय लगता है। मूल रूप से, यदि आपके पास एक सम्मिलित सूची है:

datatype 'a join = Nil | Cons of 'a * 'a join | Join of 'a join * 'a join

यह स्पष्ट है कि संघटन निरंतर समय है, और यह कि इसे एक कॉन्स-लिस्ट में बदल दिया जाए। यदि आप क्लोजर के सामान्य प्रतिनिधित्व के बारे में सोचते हैं, तो आप देख सकते हैं कि यह मूल रूप से डेटाटाइप्स के सामान्य प्रतिनिधित्व के समान पॉइंटर प्रतिनिधित्व है। (वैकल्पिक रूप से, आप इस प्रकार को एक विक्षेपित अंतर-सूची के रूप में देख सकते हैं।)O(n)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.