लोककथाएँ और रम्दा इतनी अलग क्यों हैं?


96

मैं DrBoolean की किताब पढ़कर जावास्क्रिप्ट FP सीख रहा हूं ।

मैंने कार्यात्मक प्रोग्रामिंग लाइब्रेरी की तलाश की। मुझे रमदा और फोकटले मिले। दोनों कार्यात्मक प्रोग्रामिंग लाइब्रेरी होने का दावा करते हैं।

लेकिन वे बहुत अलग हैं:

  • रामदा में सूची से निपटने के लिए उपयोगिता कार्य शामिल हैं: मानचित्र, घटाना, फ़िल्टर और शुद्ध कार्य: करी, रचना। इसमें मोनाड, फनकार से निपटने के लिए कुछ भी नहीं है।

  • हालांकि लोककथा में सूची या कार्यों की कोई उपयोगिता नहीं है। यह जावास्क्रिप्ट की तरह जावास्क्रिप्ट में कुछ बीजीय संरचनाओं को लागू करने के लिए लगता है: शायद, टास्क ...

वास्तव में मुझे अधिक पुस्तकालय मिले, वे सभी दो श्रेणियों में आते हैं। अंडरस्कोर और लॉश रमाडा की तरह हैं। फैंटेसी-लैंड, पॉइंटफ्री-फंतासी लोककथा की तरह हैं।

क्या इन दोनों अलग-अलग पुस्तकालयों को कार्यात्मक कहा जा सकता है , और यदि हां, तो क्या प्रत्येक को एक कार्यात्मक पुस्तकालय बनाता है?


1
अपनी आवश्यकताओं और शैली में जो फिट बैठता है उसका उपयोग करें और अच्छी तरह से प्रलेखित है
charlietfl

1
मैंने पाया है कि "कार्यात्मक प्रोग्रामिंग" के लिए वास्तव में तीन सामान्य-अभिप्रेत अर्थ हैं, विशेष रूप से JS में। 1. सरणियों की तरह सेट पर उच्च क्रम शुद्ध कार्यों का उपयोग कर।, पूर्व [1,2,3].map(fnSquare).reduce(fnSum)2. बड़े पैमाने पर शैक्षिक "देखो मा कोई वर " वाई-Combinator-esque संरचनाओं। 3. Function.prototypeअन्य कार्यों के व्यवहार को संशोधित करने के लिए उपयोग करना, जैसेvar isMissingID=fnContains.partial("id").negate();
डांडविस

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

1
@KeithNicholas: हाँ,
गटर

2
अभयारण्य पर भी नज़र डालें - github.com/plaid/sanctuary यह रमदा पर आधारित है, लेकिन फ़ंतासी-भूमि के प्रकारों को भी शामिल करता है।
आर्केल्डन

जवाबों:


180

कार्यात्मक विशेषताएं

कार्यात्मक प्रोग्रामिंग या एक कार्यात्मक पुस्तकालय को परिभाषित करने वाली कोई स्पष्ट सीमा नहीं है। कार्यात्मक भाषाओं की कुछ विशेषताएं जावास्क्रिप्ट में बनाई गई हैं:

  • प्रथम श्रेणी, उच्च-क्रम के कार्य
  • लैम्ब्डा / बेनामी फ़ंक्शन, क्लोजर के साथ

दूसरों को कुछ देखभाल के साथ जावास्क्रिप्ट में पूरा करना संभव है:

  • अचल स्थिति
  • रेफरेंशियल ट्रांसपेरेंसी

अभी भी अन्य 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 खैर, एक साइड-प्रोजेक्ट है, रमदा-फंतासी जो फोकटेल करता है, उसके समान है, लेकिन यह मुख्य पुस्तकालय का हिस्सा नहीं है।


1
क्या यह कहना उचित होगा कि ES6 में यील्ड की शुरुआत के साथ आलसी मूल्यांकन की क्षमता है? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Marcel Lamothe

8
नहीं। yieldयह आसान करने के लिए आलसी सूची के प्रकार के द्वारा किया प्रसंस्करण करता है Lazyया lz.js। लेकिन यह भाषा के स्तर के आलस्य के साथ मदद नहीं करता है। someFunc(a + b)जेएस में पहले के मानों को जोड़ता है aऔर bफिर उस परिणाम की आपूर्ति करता है जो पैरामीटर के रूप में someFunc में होता है। हास्केल में समकक्ष ऐसा नहीं करता है। यदि फ़ंक्शन नामक फ़ंक्शन उस मान का उपयोग कभी नहीं करता है, तो वह कभी भी जोड़ नहीं करता है। यदि यह अंततः इसका उपयोग करता है, तो इसकी गणना की जानी चाहिए, जब तक कि इसके परिणाम की आवश्यकता न हो। यदि आप कभी भी ऐसा कुछ नहीं करते हैं जो इसे मजबूर करेगा (जैसे IO) तो यह वास्तव में गणना नहीं करेगा।
स्कॉट सॉएट

@ScottSauyet शायद आप तर्क दे सकते हैं कि "आलसी मूल्यांकन" किसी न किसी रूप में ES6 जनरेटर के माध्यम से उपलब्ध है - उदाहरण के लिए JS चौखटों में "आलस्य" की विशेषताएं हैं - RxJs, ImmutableJs आदि
15 नवंबर को आर्केलडॉन

8
यह उत्तर DrBoolean की पुस्तक में एक अध्याय या अनुभाग होना चाहिए। :)
सेठ

1
Ramda प्रलेखन "सूची" का उपयोग करने के लिए जाता है निकटतम चीज़ के लिए एक आशुलिपि के रूप में जेएस सूचियों, घने सरणियों को प्रदान करता है। शुद्ध सूचियों की तुलना में इनमें अलग-अलग प्रदर्शन विशेषताएं हैं, और निश्चित रूप से कुछ अलग एपीआई हैं, लेकिन उनका उपयोग समान उद्देश्यों के लिए किया जा सकता है, और वे निकटतम देशी हैं (लेकिन देखें github.com/funkia/list ) रामदा के लिए उपलब्ध है एपीआई, जो वैचारिक रूप से शुद्ध सूचियों के साथ काम करना चाहता है। मैं सही-सही सरणियों के बिंदु पर बहस करूंगा, क्योंकि सी-स्टाइल सरणियां जेएस वाले की तुलना में अधिक विहित नहीं हैं, और कोई भी वास्तव में गणितीय लोगों के करीब नहीं है, लेकिन यह एक मामूली बिंदु है।
स्कॉट सॉएट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.