आप हास्केल या अन्य कार्यात्मक प्रोग्रामिंग भाषाओं में प्रोग्राम कैसे डिज़ाइन करते हैं?


52

मुझे c # या रूबी जैसी ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषाओं में कुछ अनुभव है। मुझे पता है कि ऑब्जेक्ट ओरिएंटेड शैली में एक कार्यक्रम कैसे डिज़ाइन किया जाए, कक्षाएं और ऑब्जेक्ट कैसे बनाएं, और उनके बीच संबंधों को कैसे परिभाषित किया जाए। मुझे कुछ डिज़ाइन पैटर्न भी पता हैं।

लोग कैसे कार्यात्मक कार्यक्रम लिखते हैं? वे कैसे शुरू करते हैं? क्या कार्यात्मक भाषाओं के लिए डिज़ाइन पैटर्न हैं? क्या कार्यात्मक भाषाओं के लिए चरम प्रोग्रामिंग या फुर्तीली विकास जैसी पद्धतियां लागू हैं?


1
संबंधित प्रश्न: stackoverflow.com/questions/3077866/…
HaskellElephant

जवाबों:


24

मैं अपना जवाब मुख्य रूप से हास्केल को ध्यान में रखते हुए लिखता हूं, हालांकि कई अवधारणाएं अन्य कार्यात्मक भाषाओं जैसे एरलांग, लिस्प (एस), और एमएल पर समान रूप से अच्छी तरह से लागू होती हैं। कुछ रूबी, पायथन, पर्ल और जावास्क्रिप्ट पर भी लागू होते हैं।

लोग कैसे कार्यात्मक कार्यक्रम लिखते हैं? वे कैसे शुरू करते हैं?

कार्य लिखकर। जब आप कार्यात्मक प्रोग्रामिंग कर रहे हैं, तो आप या तो लिख रहे हैं main, या आप एक सहायक फ़ंक्शन लिख रहे हैं। कभी-कभी आपका मुख्य लक्ष्य विभिन्न प्रासंगिक कार्यों के साथ डेटा प्रकार लिखना हो सकता है जो उस पर काम करते हैं।

फंक्शनल प्रोग्रामिंग बहुत अच्छी तरह से टॉप-डाउन और बॉटम-अप दोनों तरीकों के अनुकूल है। हास्केल दृढ़ता से अपने कार्यक्रमों को उच्च-स्तरीय भाषा में लिखने के लिए प्रोत्साहित करता है, और फिर बस अपने उच्च-स्तरीय डिज़ाइन के विवरण को परिभाषित करता है। minimumउदाहरण के लिए देखें :

minimum    :: (Ord a) => [a] -> a
minimum xs =  foldl1 min xs

किसी सूची में सबसे छोटे तत्व को खोजने के लिए फ़ंक्शन को सूची में एक ट्रावेलर्स के रूप में लिखा जाता है, प्रत्येक फ़ंक्शन को "संचायक", या वर्तमान न्यूनतम मूल्य के साथ तुलना करने के लिए न्यूनतम फ़ंक्शन का उपयोग करता है।

क्या कार्यात्मक भाषाओं के लिए डिज़ाइन पैटर्न हैं?

दो चीजें हैं जो "डिजाइन पैटर्न", इम्हो, उच्च-क्रम के कार्यों और मठों के बराबर हो सकती हैं । पूर्व की बात करते हैं। हायर-ऑर्डर फ़ंक्शंस ऐसे फ़ंक्शंस हैं जो या तो इनपुट के रूप में अन्य फ़ंक्शंस लेते हैं, या आउटपुट के रूप में फ़ंक्शंस का उत्पादन करते हैं। किसी भी कार्यात्मक भाषा आम तौर पर का गहन उपयोग करता map, filterहै, औरfold(गुना को अक्सर "कम" भी कहा जाता है): तीन बहुत ही बुनियादी उच्च-क्रम फ़ंक्शन जो किसी फ़ंक्शन को विभिन्न तरीकों से सूची में लागू करते हैं। ये एक सुंदर तरीके से छोरों के लिए बॉयलरप्लेट की जगह लेते हैं। पैरामीटर के रूप में कार्यों को पास करना प्रोग्रामिंग के लिए एक बहुत शक्तिशाली वरदान है; बहुत सारे "डिज़ाइन पैटर्न" को उच्च-क्रम के कार्यों का उपयोग करके सरल बनाया जा सकता है, अपने स्वयं के निर्माण में सक्षम होने और शक्तिशाली मानक पुस्तकालय का लाभ उठाने में सक्षम होने के नाते, जो उपयोगी कार्यों से भरा है।

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

allPlus2 :: [Int] -> [Int]
allPlus2 xs = do x <- xs
                 return (x + 2)

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

tl; डॉ। ग्रॉकिंग उच्च-क्रम के कार्य और मोनाड्स, हस्केल डिजाइन पैटर्न को तैयार करने के बराबर है। एक बार जब आप इन हास्केल अवधारणाओं को सीख लेते हैं, तो आप सोचने लगते हैं कि "डिजाइन पैटर्न" हास्केल की शक्ति को अनुकरण करने के लिए ज्यादातर सस्ते वर्कआर्ड हैं।

क्या कार्यात्मक भाषाओं के लिए चरम प्रोग्रामिंग या फुर्तीली विकास जैसी पद्धतियां लागू हैं?

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


"मैं विस्तार कर सकता था, लेकिन दुनिया को वास्तव में एक और सनक सादृश्य की आवश्यकता नहीं है।" - हमें हमेशा साधुओं के लिए अधिक उपमाओं की आवश्यकता होती है और आपका सबसे अच्छा मैंने देखा है।
एडम जेंट

1
शानदार जवाब, लेकिन मुझे लगता है कि डिजाइन पैटर्न की आपकी चर्चा थोड़ी भ्रामक है। हालांकि आपको हास्केल में OO / GOF- शैली के डिज़ाइन पैटर्न की आवश्यकता नहीं है - वास्तव में यह उनके लिए हास्यास्पद होगा - पैटर्न स्वयं एक तरीका है जिससे एक समुदाय बार-बार आने वाली समस्याओं के समाधान का समाधान करता है। हास्केल समुदाय अभी भी बहुत छोटा है, इसलिए बोलने के लिए अभी तक कई पैटर्न नहीं हैं, लेकिन यदि आपने मुझसे हास्केल पैटर्न के उदाहरणों के लिए कहा है, तो मैं GADTs या एरोइज्ड एफआरपी जैसी चीजों का उल्लेख करूंगा।
rtperson
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.