লোকতলে এবং রামদা এত আলাদা কেন?


97

আমি ডাঃবুলিয়ান বইটি পড়ে জাভাস্ক্রিপ্ট এফপি শিখছি ।

আমি প্রায়োগিক প্রোগ্রামিং লাইব্রেরি জন্য অনুসন্ধান। আমি রামদা এবং ফোকটালে পেয়েছি। উভয়ই ফাংশনাল প্রোগ্রামিং লাইব্রেরি বলে দাবি করে।

তবে এগুলি এত আলাদা:

  • রামদা তালিকার সাথে কাজ করার জন্য ইউটিলিটি ফাংশন ধারণ করে বলে মনে হচ্ছে: মানচিত্র, হ্রাস, ফিল্টার এবং খাঁটি ফাংশন: তরকারি, রচনা। এটিতে মোনাড, ফান্ট্যাক্টরের সাথে ডিল করার মতো কিছু নেই।

  • ফোকটালে তবে তালিকা বা ফাংশনগুলির জন্য কোনও উপযোগিতা নেই। মনে হচ্ছে জাভাস্ক্রিপ্টে মনাদের মতো কিছু বীজগণিত কাঠামো বাস্তবায়িত হয়েছে: সম্ভবত, কার্য ...

আসলে আমি আরও লাইব্রেরি পেয়েছি, এগুলি দুটি বিভাগের মধ্যে পড়ে বলে মনে হচ্ছে। ইন্ডস্কোর এবং লোডাশ রামদার মতো। ফ্যান্টাসি-ল্যান্ড, পয়েন্টফ্রি-ফ্যান্টাসি ফোকলের মতো।

এই খুব পৃথক লাইব্রেরি উভয়ই ক্রিয়ামূলক বলা যেতে পারে , এবং যদি তাই হয়, প্রতিটি কি একটি কার্যকরী লাইব্রেরি করে?


4
আপনার প্রয়োজনীয়তা এবং শৈলীতে ফিট করে
এমনটি

4
আমি খুঁজে পেয়েছি "ফাংশনাল প্রোগ্রামিং" এর বিশেষত তিনটি সাধারণ উদ্দেশ্যে অর্থ, বিশেষত জেএসে। 1. অ্যারে মত সেটে উচ্চতর-অর্ডার বিশুদ্ধ ফাংশন ব্যবহার করে।, প্রাক্তন [1,2,3].map(fnSquare).reduce(fnSum)2. মূলত একাডেমিক "চেহারা মা কোন Var " ওয়াই-combinator এসকিউ স্ট্রাকচার। ৩. Function.prototypeঅন্যান্য ফাংশনগুলির আচরণ পরিবর্তন করতে ব্যবহার করা, যেমনvar isMissingID=fnContains.partial("id").negate();
দন্ডাভিস

11
এখানে রমদা লেখক: রামদা মোটামুটি নিম্ন-স্তরের ইউটিলিটি লাইব্রেরি। এটি জেএসে একটি নির্দিষ্ট কার্যকরী শৈলীকে সহজতর করার উদ্দেশ্যে, বিশেষত ফাংশনগুলি রচনা করে কাজ করার উদ্দেশ্যে is রামদা ফ্যান্ট্যাসিএল স্পেসিফিকেশনের সাথে ফোক্যাটেলের মতো এর বাস্তবায়ন সহ ভাল কাজ করে। এই গ্রন্থাগারগুলি কিছুটা ভিন্ন উদ্দেশ্যে ডিজাইন করা হয়েছে। এগুলি সাধারণ বিমূর্ত তথ্যের ধরণগুলি স্বীকৃতি দেওয়ার জন্য এবং এগুলিতে অবিচ্ছিন্ন অ্যাক্সেসের অনুমতি দেওয়ার চারপাশে নির্মিত: যেমন মনোয়েডস, ফ্যান্টেক্টর এবং মোনাডস। রামদা তাদের সাথে কাজ করবে, এবং কিছু তৈরির জন্য একটি পার্শ্ব প্রকল্প রয়েছে, তবে এটি যেমন আপনি বলেছেন, এটি একেবারেই আলাদা ফোকাস।
স্কট স্যায়েট

4
@ কিথনিখোলাস: হ্যাঁ, একটি
গিটার

4
অভয়ারণ্যটিও একবার দেখুন - github.com/plaid/sanctuary এটি রামদা ভিত্তিক তবে কল্পনা-জমি ধরণেরও অন্তর্ভুক্ত।
আর্সেল্ডন

উত্তর:


182

কার্যকরী বৈশিষ্ট্যগুলি

ক্রিয়ামূলক প্রোগ্রামিং বা কার্যকরী গ্রন্থাগারকে কী সংজ্ঞায়িত করে তার কোনও পরিষ্কার-সীমানা নেই। কার্যকরী ভাষার কিছু বৈশিষ্ট্য জাভাস্ক্রিপ্টে নির্মিত হয়েছে:

  • প্রথম শ্রেণীর, উচ্চ-অর্ডার ফাংশন
  • লম্বডাস / বেনামে ফাংশন, ক্লোজার সহ

অন্যদের কিছু যত্ন সহ জাভাস্ক্রিপ্টে সম্পন্ন করা সম্ভব:

  • অপরিচ্ছন্নতা
  • রেফারেন্সিয়াল স্বচ্ছতা

এখনও অন্যরা ES6 এর অংশ, এবং এখন আংশিক বা সম্পূর্ণ উপলব্ধ:

  • কমপ্যাক্ট, এমনকি সংশ্লেষ, ফাংশন
  • টেল-কল অপ্টিমাইজেশনের মাধ্যমে পারফরম্যান্ট পুনরাবৃত্তি

এবং আরও অনেকগুলি রয়েছে যা জাভাস্ক্রিপ্টের স্বাভাবিক নাগালের বাইরে রয়েছে:

  • প্যাটার্ন ম্যাচিং
  • অলস মূল্যায়ন
  • হোমোকোনসিটি

তারপরে একটি লাইব্রেরি এটি কী ধরণের বৈশিষ্ট্যগুলি সমর্থন করার চেষ্টা করছে তা বেছে নিতে এবং এখনও যুক্তিসঙ্গতভাবে "কার্যকরী" বলা যেতে পারে।

কল্পনা-জমির স্পেসিফিকেশন

ফ্যান্টাসি জমি মান ধরনের গাণিতিক শ্রেণী তত্ত্ব ও বিমূর্ত বীজগণিত কার্যকরী প্রোগ্রামিং বৈশিষ্ট্যসমূহ নিয়ে আসা একটি সংখ্যা জন্য একটি নির্দিষ্ট হয়, যেমন ধরনের Monoid , Functor এবং একসংখ্যা । এই ধরণেরগুলি মোটামুটি বিমূর্ত এবং সম্ভবত আরও পরিচিত ধারণাগুলি প্রসারিত করে। উদাহরণস্বরূপ, ফ্যান্ট্যাক্টরগুলি এমন পাত্রে থাকে যা mapকোনও ফাংশন দিয়ে চালিয়ে যেতে পারে , যেভাবে অ্যারেটি mapব্যবহার করে চলতে পারে Array.prototype.map

ফোকলেট

ফোকাটেল হ'ল ফ্যান্টাসি-ল্যান্ড স্পেসিফিকেশনের বিভিন্ন অংশ প্রয়োগকারী এবং সহযোগী ইউটিলিটি ফাংশনের একটি ছোট সংগ্রহ types এই ধরণেরগুলি হ'ল হতে পারে , হয় , কার্যের মতো (অন্যত্র যা ভবিষ্যত বলা হয় তার সাথে খুব মিল, এবং প্রতিশ্রুতির সাথে আরও হালাল কাজিন), এবং বৈধকরণ

ফোকাটেল সম্ভবত ফ্যান্টাসি-ল্যান্ড স্পেসিফিকেশনের সর্বাধিক পরিচিত বাস্তবায়ন এবং এটি সজ্জিত। তবে এখানে একটি নির্দিষ্ট বা ডিফল্ট বাস্তবায়ন বলে কিছু নেই; ফ্যান্টাসি-ল্যান্ড কেবল বিমূর্ত প্রকারগুলি নির্দিষ্ট করে এবং অবশ্যই একটি বাস্তবায়ন অবশ্যই এই জাতীয় কংক্রিটের প্রকারগুলি তৈরি করে। ফোকাটেলের কার্যকরী লাইব্রেরি হওয়ার দাবিটি স্পষ্ট: এটি সাধারণত ফাংশনাল প্রোগ্রামিং ভাষাগুলিতে প্রাপ্ত ডেটা প্রকারগুলি সরবরাহ করে যা কার্যকরী পদ্ধতিতে প্রোগ্রাম করা যথেষ্ট সহজ করে তোলে।

এই উদাহরণটি, ফোকাটেল ডকুমেন্টেশন থেকে ( দ্রষ্টব্য : ডক্সের সাম্প্রতিক সংস্করণগুলিতে নয়) দেখায় যে এটি কীভাবে ব্যবহৃত হতে পারে:

// 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

রামদা

রামদা (অস্বীকৃতি: আমি অন্যতম লেখক) একটি খুব ভিন্ন ধরণের লাইব্রেরি। এটি আপনার জন্য নতুন ধরণের সরবরাহ করে না। 1 পরিবর্তে এটি বিদ্যমান ধরণের উপর পরিচালনা করা সহজতর করার জন্য এটি ফাংশন সরবরাহ করে। এটি ছোট ফাংশনগুলি বৃহত্তরগুলিতে রচনা করার, অপরিবর্তনীয় ডেটার সাথে কাজ করার, পার্শ্ব-প্রতিক্রিয়াগুলি এড়িয়ে যাওয়ার ধারণার চারপাশে তৈরি করা হয়েছে।

রামদা বিশেষত তালিকাগুলিতে কাজ করে, তবে বস্তুগুলিতে এবং কখনও কখনও স্ট্রিংগুলিতেও। এটি এর কলগুলির অনেকগুলি এমনভাবে প্রতিনিধিত্ব করে যে এটি ফোকলেট বা অন্যান্য ফ্যান্টাসি-ভূমি বাস্তবায়নে হস্তক্ষেপ করবে। উদাহরণস্বরূপ, Ramda এর 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]
);

অন্যান্য গ্রন্থাগারসমূহ

আসলে আমি আরও লাইব্রেরি পেয়েছি, তারা সবাই দুটি বিভাগে পড়ে বলে মনে হচ্ছে। আন্ডারস্কোর, লোডাশ রামদার মতো very ফ্যান্টাসি-ল্যান্ড, পয়েন্টফ্রি-ফ্যান্টাসি ফোকলের মতো।

এটা আসলে সঠিক নয়। প্রথমত, ফ্যান্টাসি-ল্যান্ড কেবল একটি স্পেসিফিকেশন যা গ্রন্থাগারগুলি বিভিন্ন ধরণের জন্য প্রয়োগ করার সিদ্ধান্ত নিতে পারে। ফোকটেল সেই স্পেসিফিকেশনের অনেকগুলি বাস্তবায়নগুলির মধ্যে একটি, সম্ভবত সেরা গোলাকার একটি, সম্ভবত সবচেয়ে পরিপক্ক। পয়েন্টফ্রি-ফ্যান্টাসি এবং রামদা-ফ্যান্টাসি অন্যগুলি এবং আরও অনেকগুলি রয়েছে

আন্ডারস্কোর এবং lodash Folktale ভালো কিছু তুলনায় অনেক কম সংযোগ সঙ্গে ফাংশন মহান সংখ্যা প্রদান, কৃত্রিম Ramda মত যে তারা দখল ব্যাগ লাইব্রেরি আছে। এমনকি নির্দিষ্ট কার্যকারিতাও প্রায়শই রামদা'র সাথে ওভারল্যাপ হয়। তবে আরও গভীর স্তরে, রামদা those লাইব্রেরি থেকে খুব আলাদা উদ্বেগ রয়েছে। রামদার নিকটতম কাজিনরা সম্ভবত এফকিট , ফনুক , এবং ডাব্লু জে এর মতো লাইব্রেরি রয়েছে

বিল্বি তার নিজস্ব বিভাগে রয়েছেন, রামদা সরবরাহ করেছেন এমন কিছু সরঞ্জাম এবং ফ্যান্টাসি-ল্যান্ডের সাথে সামঞ্জস্যপূর্ণ কিছু ধরণের দুটি সরঞ্জাম সরবরাহ করে। (বিল্বির লেখকও ফ্যান্টাসি-ল্যান্ডের মূল লেখক))

আপনার কল

এই সমস্ত গ্রন্থাগারকে কার্যকরী বলা ডান রয়েছে, যদিও এগুলি কার্যকরী পদ্ধতির এবং কার্যকরী প্রতিশ্রুতিতে ডিগ্রীতে ব্যাপকভাবে পরিবর্তিত হয়।

এই লাইব্রেরির কিছু আসলে একসাথে ভাল কাজ করে। রামদার ফোকলেট বা অন্যান্য ফ্যান্টাসি-জমি বাস্তবায়নের সাথে ভাল কাজ করা উচিত। যেহেতু তাদের উদ্বেগ সবেমাত্র ওভারল্যাপ হয়, তাই তারা সত্যই দ্বন্দ্ব করে না, তবে রমদা আন্তঃব্যবস্থাপনা তুলনামূলকভাবে মসৃণ করতে যথেষ্ট কাজ করেছে। আপনি বেছে নিতে পারেন এমন আরও কয়েকটি সংমিশ্রণের জন্য এটি সম্ভবত কম সত্য, তবে ES6 এর সহজ ফাংশন বাক্য গঠনটি সংহত করার বাইরে কিছুটা ব্যথাও নিতে পারে।

লাইব্রেরির পছন্দ বা ব্যবহারের জন্য লাইব্রেরির স্টাইল আপনার প্রকল্প এবং আপনার পছন্দগুলিতে নির্ভর করে। প্রচুর ভাল বিকল্প উপলব্ধ রয়েছে, এবং সংখ্যাগুলি বাড়ছে, এবং তাদের মধ্যে অনেকগুলি উন্নতি করছে। জেএসে ক্রিয়ামূলক প্রোগ্রামিং করার জন্য এটি একটি ভাল সময়।


1 ঠিক আছে, একটি সাইড-প্রজেক্ট রয়েছে, রামদা-ফ্যান্টাসি ফোকটলে যা করে তার অনুরূপ কিছু করে, তবে এটি মূল গ্রন্থাগারের অংশ নয়।


4
এটা বলা কি ন্যায়সঙ্গত হবে যে ফলন প্রবর্তনের সাথে সাথে ES6 এর অলস মূল্যায়নের সক্ষমতা আছে? বিকাশকারী.মোজিলা.আর.ইন-
মার্সেল ল্যামোথ

8
নং yieldদ্বারা Lazyবা এর দ্বারা সম্পন্ন অলস তালিকা প্রক্রিয়াকরণ বিভিন্ন ধরণের করা সহজ করে তোলে lz.js। তবে এটি ভাষা স্তর অলসতায় সহায়তা করে না। জেএসে someFunc(a + b)প্রথমে এর মানগুলি যুক্ত করে aএবং bতারপরে পরামিতি হিসাবে কিছুফুনকে সরবরাহ করে। হাস্কেলের সমতুল্য এটি করে না। যদি ডাকা ফাংশনটি কখনই সেই মানটি ব্যবহার করে না, এটি কখনই সংযোজন করে না। যদি এটি অবশেষে এটি ব্যবহার করে তবে এটির ফলাফল প্রয়োজন না হওয়া পর্যন্ত এটি গণনা হিসাবে বিবেচনা করা হয়। আপনি যদি কখনও এমন কিছু না করেন যা এটি বাধ্য করে (আইও এর মতো) এটি কখনই গণনা সম্পাদন করে না।
স্কট স্যয়েট

@ স্কটসৌয়েত সম্ভবত আপনার পক্ষে কোনও রকমে "অলস মূল্যায়ন" যুক্তিযুক্ত হতে পারে উদাহরণস্বরূপ ES6 জেনারেটরগুলির মাধ্যমে পাওয়া যায় - জেএস ফ্রেমওয়ার্কের অনেকগুলিতে "আলস্যতা" বৈশিষ্ট্য রয়েছে - আরএক্সজেএস, ইমিটেটেজেজেস ইত্যাদি
আর্সেল্ডন

9
এই উত্তরটি ডাঃ বুলিয়ানের বইয়ের একটি অধ্যায় বা বিভাগ হওয়া উচিত। :)
শেঠ

4
রামদা ডকুমেন্টেশন জেএস তালিকা, ঘন অ্যারেগুলির নিকটতম যে জিনিসটি সরবরাহ করে তার নিকটতম জিনিসটির জন্য "তালিকা" শর্টহ্যান্ড হিসাবে ব্যবহার করে। খাঁটি তালিকার তুলনায় এগুলির পারফরম্যান্স বৈশিষ্ট্য রয়েছে এবং অবশ্যই কিছুটা আলাদা এপিআই রয়েছে তবে সেগুলি একই উদ্দেশ্যে ব্যবহার করা যেতে পারে এবং এগুলি রমদা'র কাছে উপলব্ধ নিকটতম স্থানীয় (তবে github.com/funkia/list দেখুন ) প্রকারের এপিআই, যা ধারণাগতভাবে খাঁটি তালিকার সাথে কাজ করতে চায়। আমি সত্য-সত্য বিন্যাস বিন্দুকে যুক্তি দিয়ে বলব, যেহেতু সি-স্টাইলের অ্যারেগুলি জেএস এর চেয়ে আর কোনও প্রচলিত নয়, এবং আসলেই গাণিতিকের খুব কাছে নেই, তবে এটি একটি সামান্য বিষয়।
স্কট স্যয়েট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.