कार्यात्मक विशेषताएं
कार्यात्मक प्रोग्रामिंग या एक कार्यात्मक पुस्तकालय को परिभाषित करने वाली कोई स्पष्ट सीमा नहीं है। कार्यात्मक भाषाओं की कुछ विशेषताएं जावास्क्रिप्ट में बनाई गई हैं:
- प्रथम श्रेणी, उच्च-क्रम के कार्य
- लैम्ब्डा / बेनामी फ़ंक्शन, क्लोजर के साथ
दूसरों को कुछ देखभाल के साथ जावास्क्रिप्ट में पूरा करना संभव है:
- अचल स्थिति
- रेफरेंशियल ट्रांसपेरेंसी
अभी भी अन्य ES6 का हिस्सा हैं, और आंशिक रूप से या पूरी तरह से अभी उपलब्ध हैं:
- कॉम्पैक्ट, यहां तक कि कविता, कार्य
- टेल-कॉल ऑप्टिमाइज़ेशन के माध्यम से कलाकार की पुनरावृत्ति
और बहुत सारे ऐसे हैं जो वास्तव में जावास्क्रिप्ट की सामान्य पहुंच से परे हैं:
- पैटर्न मिलान
- आलसी मूल्यांकन
- Homoiconicity
एक पुस्तकालय, तब चुन सकता है और चुन सकता है कि यह किस प्रकार की सुविधाओं का समर्थन करने की कोशिश कर रहा है और अभी भी यथोचित रूप से "कार्यात्मक" कहलाता है।
काल्पनिक-भूमि विनिर्देश
काल्पनिक भूमि मानक प्रकार के गणितीय श्रेणी सिद्धांत और सार बीजगणित कार्यात्मक प्रोग्रामिंग में पोर्ट के एक नंबर के लिए एक विनिर्देश है, जैसे प्रकार monoid , functor , और इकाई । ये प्रकार काफी सार हैं, और संभवतः अधिक परिचित धारणाओं का विस्तार करते हैं। उदाहरण के लिए, फ़ंक्टर ऐसे कंटेनर होते हैं, जिन्हें map
किसी फ़ंक्शन के साथ पैड किया जा सकता है , जिस तरह से एक सरणी map
का उपयोग करके पैड किया जा सकता है Array.prototype.map
।
लोककथा
लोककथा काल्पनिक-भूमि विनिर्देश के विभिन्न भागों को लागू करने वाले प्रकारों का एक संग्रह है और साथी उपयोगिता कार्यों का एक छोटा संग्रह है। ये प्रकार हैं शायद , एअर , टास्क (जो भविष्य कहलाता है, और एक वादा करने के लिए एक अधिक कानून के चचेरे भाई के समान), और मान्यता जैसी चीजें हैं
लोककथा शायद फंतासी-भूमि विनिर्देश का सबसे प्रसिद्ध कार्यान्वयन है, और यह अच्छी तरह से सम्मानित है। लेकिन एक निश्चित या डिफ़ॉल्ट कार्यान्वयन जैसी कोई चीज नहीं है; फंतासी-भूमि केवल अमूर्त प्रकारों को निर्दिष्ट करती है, और निश्चित रूप से इस तरह के ठोस प्रकारों को लागू करना चाहिए। फ़ंक्शनल लाइब्रेरी होने का फ़ॉकटेल का दावा स्पष्ट है: यह आमतौर पर कार्यात्मक प्रोग्रामिंग भाषाओं में पाए जाने वाले डेटा प्रकार प्रदान करता है, जो कार्यात्मक तरीके से प्रोग्राम करना काफी आसान बनाते हैं।
यह उदाहरण, लोककथा प्रलेखन से ( नोट : डॉक्स के हाल के संस्करणों में नहीं), दिखाता है कि इसका उपयोग कैसे किया जा सकता है:
// We load the library by "require"-ing it
var Maybe = require('data.maybe')
// Returns Maybe.Just(x) if some `x` passes the predicate test
// Otherwise returns Maybe.Nothing()
function find(predicate, xs) {
return xs.reduce(function(result, x) {
return result.orElse(function() {
return predicate(x)? Maybe.Just(x)
: /* otherwise */ Maybe.Nothing()
})
}, Maybe.Nothing())
}
var numbers = [1, 2, 3, 4, 5]
var anyGreaterThan2 = find(function(a) { return a > 2 }, numbers)
// => Maybe.Just(3)
var anyGreaterThan8 = find(function(a) { return a > 8 }, numbers)
// => Maybe.Nothing
Ramda
रामदा (अस्वीकरण: मैं लेखकों में से एक हूं) एक बहुत ही अलग प्रकार की लाइब्रेरी है। यह आपके लिए नए प्रकार प्रदान नहीं करता है। 1 इसके बजाय, यह मौजूदा प्रकारों पर काम करना आसान बनाने के लिए कार्य प्रदान करता है। यह साइड-इफेक्ट्स से बचने के लिए, अपरिवर्तनीय डेटा के साथ काम करने के लिए, छोटे कार्यों को बड़े लोगों की रचना करने की धारणा के आसपास बनाया गया है।
रामा विशेष रूप से सूचियों पर, बल्कि वस्तुओं पर और कभी-कभी स्ट्रिंग्स पर भी काम करता है। यह इस तरह से अपनी कई कॉल को भी दर्शाता है कि यह फोकटेल या अन्य फंतासी-भूमि कार्यान्वयन के साथ हस्तक्षेप करेगा। मिसाल के तौर पर, रामदा का map
फंक्शन उसी के अनुरूप चलता है Array.prototype
, इसलिए R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
। लेकिन क्योंकि लोककथाएँ Maybe
काल्पनिक-भूमि की Functor
कल्पना को लागू करती हैं , जो मानचित्र को भी निर्दिष्ट करती है, आप map
इसके साथ रामदा का उपयोग भी कर सकते हैं :
R.map(square, Maybe.Just(5)); //=> Maybe.Just(25);
R.map(square, Maybe.Nothing); //=> Maybe.Nothing
रामाडा के कार्यात्मक पुस्तकालय होने के दावे कार्यों की रचना करना, आपके डेटा को परिवर्तित करना और केवल शुद्ध कार्यों को प्रस्तुत करना आसान बनाते हैं। रमदा का विशिष्ट उपयोग छोटे लोगों की रचना करके अधिक जटिल कार्य का निर्माण करना होगा, जैसा कि रामदा के दार्शनिक पर एक लेख में देखा गया है
// :: [Comment] -> [Number]
var userRatingForComments = R.pipe(
R.pluck('username') // [Comment] -> [String]
R.map(R.propOf(users)), // [String] -> [User]
R.pluck('rating'), // [User] -> [Number]
);
अन्य पुस्तकालय
वास्तव में मुझे अधिक पुस्तकालय मिले, वे सभी दो श्रेणी में आते हैं। अंडरस्कोर, लॉश बहुत रमा की तरह हैं। फैंटेसी-लैंड, पॉइंटफ्री-फंतासी लोककथा की तरह हैं।
यह वास्तव में सही नहीं है। सबसे पहले, फंतासी-भूमि बस एक विनिर्देश है जो पुस्तकालय विभिन्न प्रकारों के लिए लागू करने का निर्णय ले सकते हैं। लोककथा उस विनिर्देश के कई कार्यान्वयनों में से एक है, शायद सबसे अच्छा दौर वाला, निश्चित रूप से सबसे परिपक्व में से एक। पॉइंटफ्री-फंतासी और रमदा-फंतासी अन्य हैं, और कई और हैं ।
अंडरस्कोर और लॉश सतही रूप से रम्दा की तरह हैं कि वे ग्रैब-बैग लाइब्रेरी हैं, फ़ॉकटेल जैसी किसी चीज़ की तुलना में बहुत कम सामंजस्य के साथ कई प्रकार के कार्य प्रदान करते हैं। और यहां तक कि विशिष्ट कार्यक्षमता अक्सर रामदा के साथ ओवरलैप होती है। लेकिन गहरे स्तर पर, रामदास की उन पुस्तकालयों से बहुत अलग चिंताएँ हैं। रामदा के सबसे करीबी चचेरे भाई शायद FKit , Fnuc , और Wu.js जैसे पुस्तकालय हैं ।
बिलबी खुद की एक श्रेणी में है, दोनों को कई उपकरण प्रदान करता है जैसे कि रामदा द्वारा प्रदान किए गए और काल्पनिक-भूमि के अनुरूप कुछ प्रकार। (बिलबी के लेखक फैंटेसी-भूमि के मूल लेखक भी हैं।)
तुम्हारा कॉल
इन सभी पुस्तकालयों को कार्यात्मक कहा जाना सही है, हालांकि वे कार्यात्मक दृष्टिकोण और कार्यात्मक प्रतिबद्धता की डिग्री में बहुत भिन्न हैं।
इनमें से कुछ पुस्तकालय वास्तव में साथ मिलकर काम करते हैं। रामदा को फोकटले या अन्य काल्पनिक-भूमि कार्यान्वयन के साथ अच्छी तरह से काम करना चाहिए। चूँकि उनकी चिंताएँ बमुश्किल ओवरलैप होती हैं, वे वास्तव में संघर्ष नहीं करते हैं, लेकिन रामदास अंतर्मन को अपेक्षाकृत सहज बनाने के लिए पर्याप्त हैं। यह संभवतः आपके द्वारा चुने गए कुछ अन्य संयोजनों के लिए कम सच है, लेकिन ES6 का सरल कार्य सिंटैक्स भी कुछ दर्द को एकीकृत करने में से एक हो सकता है।
पुस्तकालय की पसंद, या यहां तक कि उपयोग करने के लिए पुस्तकालय की शैली , आपकी परियोजना और आपकी प्राथमिकताओं पर निर्भर करने वाली है। बहुत सारे अच्छे विकल्प उपलब्ध हैं, और संख्या बढ़ रही है, और उनमें से कई में बहुत सुधार हो रहा है। जेएस में कार्यात्मक प्रोग्रामिंग करने के लिए यह एक अच्छा समय है।
1 खैर, एक साइड-प्रोजेक्ट है, रमदा-फंतासी जो फोकटेल करता है, उसके समान है, लेकिन यह मुख्य पुस्तकालय का हिस्सा नहीं है।