हां, एल्गोरिदम अभी भी कार्यात्मक भाषाओं में मौजूद हैं, हालांकि वे हमेशा अनिवार्य लोगों के समान दिखते नहीं हैं।
मॉडल के मॉडल के आधार पर "समय" की अंतर्निहित धारणा का उपयोग करने के बजाय, कार्यात्मक भाषाएं डेटा ट्रांसफॉर्मेशन के साथ करती हैं। वास्तव में एक अच्छा उदाहरण के रूप में, आप दो हिस्सों में ढेर प्रकार के बारे में सोच सकते हैं: एक सूची से ढेर में एक परिवर्तन और फिर एक ढेर से एक सूची में परिवर्तन।
आप प्रत्यावर्तन के साथ काफी स्वाभाविक रूप से कदम-दर-कदम तर्क मॉडल कर सकते हैं, या, बेहतर अभी तक, मौजूदा उच्च क्रम कार्यों है कि विभिन्न संगणना आप कर सकते हैं पर कब्जा का उपयोग कर। इन मौजूदा टुकड़ों को लिखना शायद मैं वास्तव में "कार्यात्मक शैली" कहूंगा: आप अपने एल्गोरिदम को एक मानचित्र के बाद एक गुना के बाद प्रकट कर सकते हैं।
आलस्य इस और भी दिलचस्प "डेटा संरचना" और "एल्गोरिथ्म" के बीच लाइनों धुंधला करके बनाता है। एक आलसी डेटा संरचना, एक सूची की तरह, स्मृति में मौजूद पूरी तरह से मौजूद नहीं है। इसका अर्थ यह है कि आप उन सभी कार्यों को लिख सकते हैं जो बड़े पैमाने पर डेटा संरचनाओं का निर्माण करते हैं, वास्तव में उन सभी जगहों का उपयोग करने या एसिम्प्टोटिक प्रदर्शन को त्यागने की आवश्यकता के बिना। एक छोटी सी उदाहरण के रूप में, factorial
की इस परिभाषा पर विचार (हाँ, यह एक क्लिच है, लेकिन मैं बेहतर कुछ भी साथ नहीं आ सकता: /):
factorial n = product [1..n]
यह दो से बना भागों है: पहला, हम एक सूची उत्पन्न 1
n
के लिए और फिर से हम इसे गुणा (product
) द्वारा गुना। लेकिन, आलस्य के लिए धन्यवाद, सूची पूरी तरह से स्मृति में मौजूद नहीं है! हम पैदा समारोह के रूप में ज्यादा का मूल्यांकन के रूप में हम product
के प्रत्येक चरण पर की जरूरत है, और कचरा कलेक्टर के रूप में हम उन लोगों के साथ काम हो गया पुराने कोशिकाओं reclaims। तो भी इस हालांकि लगता है कि यह O(n)
स्मृति की आवश्यकता होगी, यह वास्तव में O(1)
साथ दूर हो जाता है। (ठीक है, मानते हैं कि सभी संख्या O(1)
मेमोरी लेते हैं।)
इस मामले में, एल्गोरिदम की "संरचना", चरणों का क्रम, सूची संरचना द्वारा प्रदान की जाती है। यहां सूची एक वास्तविक सूची की तुलना में फॉर-लूप के करीब है!
तो कार्यात्मक प्रोग्रामिंग में, हम कुछ अलग-अलग तरीकों से चरणों के अनुक्रम के रूप में एक एल्गोरिदम बना सकते हैं: ट्रांसफॉर्मेशन (शायद सामान्य उच्च-आदेश कार्यों के आधार पर) या मध्यवर्ती डेटा संरचनाओं को बनाकर और उपभोग करके प्रत्यक्ष रिकर्सन द्वारा lazily।
(define (make-list num)
(let loop ((x num) (acc '()))
(if (zero? x)
acc
(loop (- x 1) (cons x acc)))))
(make-list 5) ; dumb compilers might do this
(display (make-list 10)) ; force making a list (because we display it)
अपने तर्क के साथ
make-list
एक एल्गोरिथ्म के बाद से यह यह चरणों में गणना है ऐसा नहीं करता विचार नहीं किया जाएगा, लेकिन यह वास्तव में सच है:
आप जो भी भाषा उपयोग करते हैं, ऑपरेशन किसी दिए गए अनुक्रम में होते हैं। दरअसल, कार्यात्मक प्रोग्रामिंग में चुनौतियों में से एक यह महसूस कर रहा है कि आप एक विशेष अनुक्रम को मजबूर कर सकते हैं। – Marcin
लैम्ब्डा कैलकुस का आविष्कार किया गया था * एल्गोरिदम की * औपचारिक * परिभाषा देने के प्रयास के रूप में। तब से किसी भी अनौपचारिक परिभाषा व्यर्थ है। –
कार्यात्मक प्रोग्रामिंग निश्चित रूप से समय के बारे में जागरूकता है। कार्य को पूर्ण * मूल्यांकन * करने से पहले कार्यों के लिए तर्कों का मूल्यांकन किया जाना चाहिए। (आलसी मूल्यांकन केवल कार्यकाल के शरीर से पहले मूल्यांकन को मजबूर करने के बजाय, यथासंभव मूल्यांकन में देरी करता है।) – chepner