2009-10-08 19 views
6

बुनियादी दिनचर्या कार्यान्वयन के लिए 'शुद्ध' कार्यात्मक प्रोग्रामिंग कितना अच्छा है, उदा। सूची सॉर्टिंग, स्ट्रिंग मिलान आदि?बेसिक एल्गोरिदम के लिए कार्यात्मक प्रोग्रामिंग

किसी भी कार्यात्मक भाषा के मूल दुभाषिया के भीतर ऐसे बुनियादी कार्यों को लागू करना आम है, जिसका अर्थ है कि वे एक अनिवार्य भाषा (सी/सी ++) में लिखे जाएंगे। यद्यपि कई अपवाद हैं ..

कम से कम, मैं पूछना चाहता हूं: 'शुद्ध' कार्यात्मक भाषा में कोडिंग करते समय अनिवार्य शैली का अनुकरण करना कितना मुश्किल है?

+0

आप पूछ रहे हैं कि किसी अन्य में लिखते समय एक शैली का अनुकरण करना कितना मुश्किल है? – ShreevatsaR

+3

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

+0

@ श्रीवत्सरा: शायद मुझे फिर से जाना चाहिए, लेकिन मैं यही पूछ रहा हूं। 'प्रोजेक्ट', 'डू' जैसे विशेष संरचनाओं के बिना शुद्ध कार्यात्मक भाषा में कोडिंग करते समय अनिवार्य कार्यक्रम लिखना कितना मुश्किल है ... उदाहरण के लिए, यह एक ज्ञात चाल है कि कार्यात्मक कार्यक्रम बंद करने के उपयोग के साथ 'अनिवार्य' राज्य का अनुकरण कर सकते हैं। मैं यही पूछ रहा था। – Bubba88

उत्तर

6

कैसे अच्छा बुनियादी दिनचर्या कार्यान्वयन, उदाहरण के लिए 'शुद्ध' कार्यात्मक प्रोग्रामिंग है सूची सॉर्टिंग, स्ट्रिंग मिलान आदि?

बहुत। मैं हास्केल में आपकी समस्याएं करूंगा, और मैं इसके बारे में थोड़ा सा शब्दशः करूंगा। मेरा लक्ष्य आपको यह विश्वास दिलाना नहीं है कि समस्या 5 वर्णों में हो सकती है (यह शायद जे में हो सकती है), बल्कि आपको संरचनाओं का विचार देने के लिए।

import Data.List -- for `sort` 
stdlistsorter :: (Ord a) => [a] -> [a] 
stdlistsorter list = sort list 

Data.List

import Data.List -- for `delete` 
selectionsort :: (Ord a) => [a] -> [a] 
selectionsort [] = [] 
selectionsort list = minimum list : (selectionsort . delete (minimum list) $ list) 

चयन तरह कार्यान्वयन से sort समारोह का उपयोग करके सूची छंटाई।

quicksort :: (Ord a) => [a] -> [a] 
quicksort [] = [] 
quicksort (x:xs) = 
    let smallerSorted = quicksort [a | a <- xs, a <= x] 
     biggerSorted = quicksort [a | a <- xs, a > x] 
    in smallerSorted ++ [x] ++ biggerSorted 

त्वरित सॉर्ट कार्यान्वयन।

import Data.List -- for `isInfixOf` 
stdstringmatch :: (Eq a) => [a] -> [a] -> Bool 
stdstringmatch list1 list2 = list1 `isInfixOf` list2 

स्ट्रिंग मिलान से Data.list

यह किसी भी कार्यात्मक भाषा के आधार दुभाषिया , जो मतलब है कि वे जरूरी एक में लिखा जाएगा भीतर इस तरह के बुनियादी कार्यों को लागू करने के लिए आम है isInfixOf फ़ंक्शन का उपयोग भाषा (सी/सी ++)। हालांकि कई अपवाद हैं ..

निर्भर करता है। कुछ कार्य अधिक स्वाभाविक रूप से व्यक्त किए जाते हैं। हालांकि, मुझे उम्मीद है कि मैंने आपको विश्वास दिलाया है कि कुछ एल्गोरिदम भी एक कार्यात्मक तरीके से स्वाभाविक रूप से व्यक्त किए जाते हैं।कितना मुश्किल यह जरूरी शैली अनुकरण करने के लिए, जबकि 'शुद्ध' कार्यात्मक भाषा में कोडिंग है:

कम से कम, मैं पूछने के लिए करना चाहते हैं?

यह इस बात पर निर्भर करता है कि आपको हास्केल में मोनाड्स कितना मुश्किल लगता है। व्यक्तिगत रूप से, मुझे समझना मुश्किल लगता है।

+1

हां। 'न्यूनतम ',' हटाएं ', और' फ़िल्टर' सभी पूरी तरह कार्यात्मक हैं। – artagnon

+0

monads के बारे में: http://stackoverflow.com/questions/2366/can-anyone-explain-monads देखें विशेष रूप से http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and एचटीएमएल। यह समझना जरूरी नहीं है कि आम तौर पर मोनाड * का उपयोग शुरू करने के लिए * केवल उन विशिष्ट मोनैड को समझें जिन्हें आप चाहते हैं - किसी दिन वे सभी एक साथ क्लिक करेंगे और यह स्पष्ट होगा कि वे "समान" हैं, लेकिन तब तक यह आवश्यक नहीं है: -) – ShreevatsaR

0

यह अनिवार्य शैली के साथ कार्यात्मक अनुकरण के दूसरे तरीके से बहुत अच्छी तरह से काम करता है।

याद रखें कि एक दुभाषिया या वीएम वेयर के आंतरिक धातु के करीब इतने करीब हैं और प्रदर्शन महत्वपूर्ण है कि आपको स्तर का आकलन करने पर विचार करना चाहिए और प्रत्येक निर्देश के लिए घड़ी चक्रों की गणना करना चाहिए (जैसे स्मॉलटॉक डोफिन बस इसे कर रहा है और परिणाम प्रभावशाली हैं)। सीपीयू अनिवार्य हैं।

लेकिन सभी बुनियादी एल्गोरिदम कार्यान्वयन करने में कोई समस्या नहीं है - जिसे आप उल्लेख करते हैं निम्न स्तर नहीं है - वे मूल बातें हैं।

+0

मैं इसे 'मूल' में संपादित करूंगा। धन्यवाद। – Bubba88

1

लगभग सभी कार्यात्मक प्रोग्रामिंग भाषाओं में अनिवार्य कोडिंग (जैसे do हास्केल में) की अनुमति देने के लिए कुछ निर्माण हैं। कई समस्या डोमेन हैं जिन्हें "शुद्ध" कार्यात्मक प्रोग्रामिंग के साथ हल नहीं किया जा सकता है। उनमें से एक नेटवर्क प्रोटोकॉल है, उदाहरण के लिए जहां आप को सही क्रम में आदेशों की एक श्रृंखला की आवश्यकता है। और ऐसी चीजें शुद्ध कार्यात्मक प्रोग्रामिंग के लिए खुद को उधार नहीं देती हैं।

मुझे Lothar से सहमत होना है, हालांकि, सूची सॉर्टिंग और स्ट्रिंग मिलान वास्तव में ऐसे उदाहरण नहीं हैं जिन्हें आपको अनिवार्य रूप से हल करने की आवश्यकता है। ऐसी चीजों के लिए जाने-माने एल्गोरिदम हैं और उन्हें पहले से ही कार्यात्मक भाषाओं में कुशलतापूर्वक कार्यान्वित किया जा सकता है।

+0

मैं समझता हूं। मैं उन मामलों का उल्लेख नहीं करना चाहता था जहां 'राज्य' और 'अनिवार्यता' परिभाषा के अनुसार आवश्यक है (जैसे नेटवर्किंग प्रोटोकॉल के साथ आपका उदाहरण); केवल बुनियादी कम्प्यूटेशनल कार्यों, जहां लक्ष्य समारोह की गणना करना है। तो, वर्तमान प्रस्ताव यह है कि हम आसानी से ऐसी चीजों के लिए एक शुद्ध कार्यात्मक एल्गोरिदम लिख सकते हैं? – Bubba88

+0

आप कर सकते हैं, लेकिन यदि आप ऐसा करने के इच्छुक हैं तो आप इसे (लगभग) पूरी तरह अनिवार्य रूप से लिख सकते हैं। मेरा उदाहरण बस कुछ ऐसी चीज को हाइलाइट करता है जहां अनिवार्य शैली * बिल्कुल जरूरी है * इसे ठीक से काम करने के लिए। कुछ भी आपको अन्य चीजों के लिए एक ही तंत्र का उपयोग करने से रोकता है। – Joey

1

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

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

भी

How does functional programming affect the structure of your code?

+0

इसमें लेख और उदाहरण मेरे लिए काफी प्रेरक नहीं थे, लेकिन यह मेरी राय है। संदर्भ प्रदान करने के लिए Thanx, वैसे भी। – Bubba88

0

देखें मैं सूची छंटाई के बारे में पता नहीं है, लेकिन आप कठिन संकलक या क्रम में स्ट्रिंग मिलान के कुछ प्रकार के बिना एक भाषा bootstrapp को दबाया जा चाहते हैं। इसलिए आपको भाषा बनाने के लिए उस दिनचर्या की आवश्यकता है। चूंकि भाषा में स्ट्रिंग मिलान करने के लिए लाइब्रेरी बनाते समय, एक ही कोड को दो बार लिखने के लिए बहुत अधिक बिंदु नहीं है, तो आप पहले लिखे गए कोड को कॉल करते हैं। जिस क्रम में यह लगातार रिलीज में होता है, इस पर निर्भर करेगा कि भाषा को स्वयं कैसे होस्ट करना है, लेकिन जब तक कि यह एक मजबूत डिजाइन लक्ष्य नहीं है, तो इसे बदलने का कोई कारण नहीं होगा।

+0

हां, मुझे कई अंतर्निहित कार्यों की आवश्यकता का एहसास है; लेकिन मेरा वास्तविक सवाल था: क्या उन्हें सभी को सी/सी ++ में लिखा जाना चाहिए (जो अनिवार्य है)? सुधार करने के लिए खेद है। – Bubba88

+0

नहीं, आप उन्हें असेंबलर में लिख सकते हैं, या प्लेटफॉर्म पहले से ही समर्थन कर सकते हैं। –

+0

ठीक है, मुझे वह मिला है) – Bubba88

6

1) मानक क्या है? आप किस संपत्ति की इच्छा रखते हैं?

सूची सॉर्टिंग? आसान।चलो हास्केल में क्विक्सोर्ट करें:

sort [] = [] 
sort (x:xs) = sort (filter (< x) xs) ++ [x] ++ sort (filter (>= x) xs) 

इस कोड को समझने में बेहद आसान होने का लाभ है। यदि सूची खाली है, तो इसे हल किया गया है। अन्यथा, पहले तत्व एक्स को कॉल करें, एक्स से कम तत्व ढूंढें और उन्हें सॉर्ट करें, एक्स से अधिक तत्व ढूंढें और उनको सॉर्ट करें। फिर क्रमबद्ध एक्स को मध्य में एक्स के साथ संयोजित करें। सी ++ में समझने योग्य दिखने का प्रयास करें।

बेशक, विलय सूचियों को क्रमबद्ध करने के लिए विलयॉर्ट बहुत तेज़ है, लेकिन कोड भी 6 गुना लंबा है।

2) पूरी तरह से कार्यात्मक रहते हुए अनिवार्य शैली को लागू करना बेहद आसान है। अनिवार्य शैली का सार क्रियाओं का अनुक्रम है। मोनैड का उपयोग करके क्रियाओं को शुद्ध सेटिंग में अनुक्रमित किया जाता है। monads का सार बंधन समारोह है:

(Monad m) => (>>=) :: m a -> (a -> m b) -> m b 

इस समारोह सी ++ में मौजूद है, और यह ; कहा जाता है।

हास्केल में गतिविधियों का क्रम, उदाहरण के लिए, thusly लिखा है:

putStrLn "What's your name?" >>= 
    const (getLine >>= \name -> putStrLn ("Hello, " ++ name)) 

कुछ वाक्य रचना चीनी इस नज़र अधिक जरूरी बनाने के लिए उपलब्ध है (लेकिन ध्यान दें कि इस ठीक उसी कोड है):

do { 
    putStrLn "What's your name?"; 
    name <- getLine; 
    putStrLn ("Hello, " ++ name); 
} 
+1

मुझे लगता है कि उस quicksort के लिए, आप 'find' के बजाय' फ़िल्टर' चाहते थे। 'क्रमबद्ध करें [4, 1, 7, 0]' के लिए, पहला 'ढूंढ' 'बस 1' लौटाएगा जबकि 'फ़िल्टर'' [1, 0] 'वापस आ जाएगा। – Chuck

+0

आपका त्वरित सॉर्ट कार्यान्वयन गलत है- अपेक्षित प्रकार '[ए] 'अनुमानित प्रकार से मिलान नहीं हो सकता है' शायद ए 1 '। – artagnon

+0

क्षमा करें, Artagnon। एस/ढूंढ/फ़िल्टर/जी – Apocalisp

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