2011-01-06 24 views
15

सबसे पहले मैं एक हास्केल नौसिखिया हूं। मैंने इसे पढ़ा है: Immutable functional objects in highly mutable domain और मेरा प्रश्न लगभग समान है - कैसे एल्गोरिदम को कुशलतापूर्वक लिखना है जहां राज्य को बदलना है। चलिए उदाहरण के लिए डिजस्ट्रा के एल्गोरिदम लेते हैं। नए पथ पाए जाएंगे और दूरी अपडेट की जानी चाहिए। और पारंपरिक भाषाओं में यह आसान है जबकि हास्केल में उदाहरण के लिए मैं केवल पूरी तरह से नई दूरी बनाने के बारे में सोच सकता हूं जो बहुत धीमी और स्मृति उपभोग करेगा। क्या ऐसे मामलों के लिए डिज़ाइन पैटर्न की तरह कुछ है जहां किसी को म्यूटेबल डेटा स्ट्रक्चर और स्पीड और मेमोरी उपयोग के साथ एल्गोरिदम लागू करना चाहिए मुख्य चिंताएं हैं?कार्यात्मक प्रोग्रामिंग में व्यवहार्यता

उत्तर

19

निश्चित रूप से कार्यात्मक भाषाएं इस समस्या को हल करने के कई तरीके हैं।

  1. विभिन्न डेटा संरचनाओं - कई डाटा संरचनाओं एक पूरी तरह कार्यात्मक तरीके से लागू किया जा सकता है, जरूरी संस्करणों के रूप में ही एल्गोरिथम जटिलता के साथ। शायद इस क्षेत्र में सबसे प्रसिद्ध काम क्रिस ओकासाकी का Purely Functional Data Structures है, लेकिन कई अन्य संसाधन भी हैं। डिजस्ट्रा के एल्गोरिदम के लिए, Martin Erwig का काम functional graphs पर उचित है। this question भी देखें।

  2. विभिन्न एल्गोरिदम - कुछ एल्गोरिदम में अंतर्निहित उत्परिवर्तन की धारणाएं हैं, क्विक्सोर्ट इसका एक उदाहरण है। इस मामले में एक वैकल्पिक एल्गोरिदम का उपयोग किया जा सकता है जो अपरिवर्तनीयता के लिए अधिक उपयुक्त है।

  3. उत्परिवर्तनीय राज्य - प्रत्येक कार्यात्मक भाषा राज्य मोनैड के साथ कार्यात्मक स्थिति का मॉडल कर सकती है। अधिकांश अन्य प्रकार के उत्परिवर्तन भी प्रदान करते हैं, जैसे हास्केल के एसटी मोनैड और आईओआरआईएफ।

+5

अफसोस की बात है, आलसी कार्यात्मक अपरिवर्तनीय भाषाओं के लिए उपयुक्त डेटा संरचनाओं और एल्गोरिदम में अनुसंधान सख्त अनिवार्य उत्परिवर्तनीय भाषाओं के लिए पीछे है। :-( – ephemient

6

ST Monad आपको आंतरिक रूप से उत्परिवर्तनीय स्थिति का उपयोग करने देता है, लेकिन एक शुद्ध बाहरी इंटरफ़ेस प्रस्तुत करता है।

6

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

1

एमएल डेरिवेटिव (जैसे OCaml, एसएमएल, एफ # के रूप में), वहाँ "संदर्भ" है, जो परिवर्तनशील चर के रूप में इस्तेमाल किया जा सकता है।

हास्केल में, यह साफ़ रूप से संभाला नहीं जाता है। राज्य को सामान्य "पूरी तरह कार्यात्मक" शैली से ढंक नहीं किया जाता है। शुद्ध एफपी भाषाएं "अनन्त सत्य" से निपटती हैं, और इस प्रकार "क्षणिक सत्य" के साथ काम करने के लिए बहुत उपयुक्त नहीं हैं (हालांकि यह निश्चित रूप से किया जा सकता है)।

हालांकि, हाँ, कभी कभी हम परिवर्तनशील राज्य की जरूरत है ATS जैसी भाषाएं विनाशकारी अपडेट और सुरक्षित संसाधन मैनिपुलेशन को संभालने के लिए रैखिक प्रकार शामिल करती हैं।

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