পদ্ধতিগত এবং কার্যকরী মধ্যে পার্থক্য সত্যিই বুঝতে


114

পদ্ধতিগত এবং কার্যকরী প্রোগ্রামিং প্যারাডিমগুলির মধ্যে পার্থক্য বুঝতে আমার সত্যিই খুব কষ্ট হচ্ছে time

ফাংশনাল প্রোগ্রামিংয়ে উইকিপিডিয়া এন্ট্রি থেকে প্রথম দুটি অনুচ্ছেদ এখানে রয়েছে :

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

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

অনুচ্ছেদ 2 যেখানে এটি বলে

বিপরীতক্রমে, ফাংশনাল কোডে, একটি ফাংশনের আউটপুট মান কেবলমাত্র যুক্তিগুলির উপর নির্ভর করে যা ফাংশনে ইনপুট হয়, সুতরাং fএকটি আর্গুমেন্টের জন্য একই মান সহ দুবার একটি ফাংশন কল করা xএকই ফলাফল f(x)উভয় সময় একই ফলাফল তৈরি করে ।

প্রক্রিয়াজাতীয় প্রোগ্রামিংয়ের ক্ষেত্রেও কি একই একই ঘটনা নয়?

প্রসেসিয়াল বনাম কার্যক্ষম মধ্যে কী দেখতে হবে?


1
আবাহাইয়ের "কমনীয় পাইথন: ফাংশনাল প্রোগ্রামিং ইন পাইথনে" লিঙ্কটি ভেঙে দেওয়া হয়েছিল। লিঙ্কগুলির একটি ভাল সেট এখানে দেওয়া হয়েছে: ibm.com/developerworks/linux/library/l-prog/index.html আইবিএম
ক্রিস কোকনাত

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

উত্তর:


276

ফাংশনাল প্রোগ্রামিং

ফাংশনাল প্রোগ্রামিং মানে ফাংশনকে মান হিসাবে বিবেচনা করার ক্ষমতা বোঝায়।

আসুন "নিয়মিত" মানগুলির সাথে সাদৃশ্য বিবেচনা করুন। আমরা দুটি পূর্ণসংখ্যা মান নিতে পারি এবং +একটি নতুন পূর্ণসংখ্যা পেতে অপারেটরটি ব্যবহার করে এগুলি একত্রিত করতে পারি । অথবা আমরা একটি ভাসমান পয়েন্ট সংখ্যা পেতে একটি ভাসমান পয়েন্ট সংখ্যা দিয়ে পূর্ণসংখ্যাকে গুণ করতে পারি।

ফাংশনাল প্রোগ্রামিংয়ে, আমরা কমপোজ বা লিফ্টের মতো অপারেটরগুলি ব্যবহার করে একটি নতুন ফাংশন মান তৈরি করতে দুটি ফাংশন মান একত্রিত করতে পারি । অথবা আমরা মানচিত্র বা ভাঁজের মতো অপারেটরগুলি ব্যবহার করে একটি নতুন ডেটা মান তৈরি করতে একটি ফাংশন মান এবং একটি ডেটা মান একত্রিত করতে পারি ।

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

প্রক্রিয়াজাতীয় প্রোগ্রামিং

পদ্ধতিগত প্রোগ্রামিং নির্দেশাবলীর একটি সাধারণ ক্রমকে কোনও পদ্ধতিতে সজ্জিত করার ক্ষমতা বোঝায় যাতে সেই নির্দেশাবলী অনুলিপি করে অনুলিপি করে অনেক জায়গা থেকে অনুলিপি করা যায় না copy পদ্ধতিগুলি প্রোগ্রামিংয়ের প্রথম দিকের বিকাশ হিসাবে, সামর্থ্যটি প্রায়শই মেশিনের মাধ্যমে বা সমাবেশ-ভাষা প্রোগ্রামিংয়ের দ্বারা দাবি করা প্রোগ্রামিংয়ের শৈলীর সাথে যুক্ত হয়: এমন একটি শৈলী যা স্ট্রোকের অবস্থান এবং সেই জায়গাগুলির মধ্যে ডেটা সরিয়ে দেয় এমন নির্দেশাবলীর ধারণার উপর জোর দেয়।

কনট্রাস্ট

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

function allOdd(words) {
  var result = true;
  for (var i = 0; i < length(words); ++i) {
    var len = length(words[i]);
    if (!odd(len)) {
      result = false;
      break;
    }
  }
  return result;
}

আমি এই উদাহরণটি বোধগম্য যে দেওয়া হিসাবে এটি গ্রহণ করব। এখন, কার্যকরী শৈলী:

function allOdd(words) {
  return apply(and, map(compose(odd, length), words));
}

ভিতরে থেকে কাজ করা, এই সংজ্ঞাটি নিম্নলিখিত জিনিসগুলি করে:

  1. compose(odd, length)oddএবং lengthফাংশনগুলি একত্রিত করে একটি নতুন ফাংশন উত্পাদন করে যা কোনও স্ট্রিংয়ের দৈর্ঘ্য বিজোড় কিনা তা নির্ধারণ করে।
  2. map(..., words)প্রতিটি উপাদানটির জন্য সেই নতুন ফাংশনটিকে কল করে words, শেষ পর্যন্ত বুলিয়ান মানগুলির একটি নতুন তালিকা ফিরিয়ে দেয়, প্রতিটি নির্দেশ করে যে শব্দটির সাথে সম্পর্কিত শব্দের একটি বিজোড় সংখ্যার অক্ষর রয়েছে কিনা।
  3. apply(and, ...)ফলে লিস্টে "এবং" অপারেটর প্রযোজ্য, এবং চূড়ান্ত ফল একত্রে Booleans সব -ing।

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

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

আরও পড়া

এই প্রশ্নটি অনেক আসে ... উদাহরণস্বরূপ:

জন ব্যাকাসের টুরিং অ্যাওয়ার্ডের বক্তৃতাটি কার্যকরী প্রোগ্রামিংয়ের প্রেরণাগুলি দুর্দান্তভাবে বর্ণনা করেছে:

ভ্যান নিউম্যান স্টাইল থেকে প্রোগ্রামিং মুক্ত হতে পারে?

আমার সত্যিই সেই প্রবন্ধটি বর্তমান প্রসঙ্গে উল্লেখ করা উচিত নয় কারণ এটি বেশ প্রযুক্তিগত হয়ে যায়, খুব দ্রুত। আমি কেবল প্রতিরোধ করতে পারিনি কারণ আমি মনে করি এটি সত্যই ভিত্তিক।


সংযোজন - 2013

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

  • ক্যোয়ারী (যেমন তালিকা বোঝার জন্য, ভাষা সংহত জিজ্ঞাসা)
  • ডেটাফ্লো (যেমন অন্তর্ভুক্ত পুনরাবৃত্তি, বাল্ক অপারেশন)
  • অবজেক্ট-ভিত্তিক (যেমন এনক্যাপসুলেটেড ডেটা এবং পদ্ধতি)
  • ভাষা-ভিত্তিক (যেমন অ্যাপ্লিকেশন-নির্দিষ্ট সিনট্যাক্স, ম্যাক্রোগুলি)

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

আলোচিত দুটি শৈলীর মধ্যে পার্থক্য জোর দেওয়ার জন্য প্রদর্শিত উদাহরণগুলি ইচ্ছাকৃতভাবে এই অন্যান্য প্রোগ্রামিং শৈলীতে মিশ্রণ এড়াতে পারে avoid


1
সত্যিই দুর্দান্ত উত্তর, তবে আপনি কোডটি কিছুটা সহজ করতে পারবেন, উদাহরণস্বরূপ: "ফাংশন অলড (শব্দ) {ফোরচ (শব্দে স্বয়ং শব্দ) d বিজোড় (দৈর্ঘ্য (শব্দ)? মিথ্যা প্রত্যাবর্তন
:;

কার্যকরী শৈলীটি পাইথনের "ফাংশনাল স্টাইল" এর সাথে তুলনা করা বেশ কঠিন: ডিএফ বিজোড়_ওয়ার্ডস (শব্দ): প্রত্যাবর্তন [এক্স এর জন্য x শব্দে যদি বিজোড় (লেন (এক্স))]
বক্স করা

@ বাক্সযুক্ত: আপনার odd_words(words)সংজ্ঞা উত্তরগুলির চেয়ে আলাদা কিছু করে allOdd। ফিল্টারিং এবং ম্যাপিংয়ের জন্য, তালিকা বোঝার প্রায়শই পছন্দ করা হয় তবে এখানে ফাংশনটি allOddশব্দের একটি তালিকা একক বুলিয়ান মানকে হ্রাস করার কথা।
ShinNoNoir

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

@ মিশু আপনার ধারণাকে ধরে রাখার জন্য ভাষাটি উভয়ই লেজ পুনরাবৃত্ত এবং কঠোর এবং সংক্ষিপ্তসার্কিট হওয়া দরকার, আমি বিশ্বাস করি।
kqr

46

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

এই মানসিকতার ফলস্বরূপ, এফপি প্রোগ্রামগুলি সাধারণত কী হবে তা বর্ণনা করে, কীভাবে এটি ঘটবে তার নির্দিষ্ট ব্যবস্থার পরিবর্তে - এটি শক্তিশালী কারণ যদি আমরা "নির্বাচন" এবং "কোথায়" এবং "সমষ্টি" মানে কী তা স্পষ্টভাবে বলতে পারি, আমরা তাদের বাস্তবায়নগুলি অদলবদল করতে মুক্ত, যেমন আমরা অ্যাসপ্যারেনাল () এর সাথে করি এবং হঠাৎ আমাদের একক থ্রেডযুক্ত অ্যাপ্লিকেশনটি এন কোরগুলিতে স্কেল করে ।


কোড উদাহরণ স্নিপেট ব্যবহার করে আপনি যে কোনও উপায়ে বিপরীতে পারেন? সত্যই এটির প্রশংসা করুন
ফিলোক্সোফার

1
@ কারেক্সফিলো: এখানে একটি খুব সাধারণ কাজ (1 থেকে n পর্যন্ত সংখ্যা যুক্ত করুন)। অত্যাবশ্যক: বর্তমান সংখ্যাটি সংশোধন করুন, এখন পর্যন্ত যোগফলটি সংশোধন করুন। কোড: int i, যোগফল; যোগ = 0; (i = 1; i <= n; i ++) {যোগ + = i; }। কার্যকরী (হাস্কেল): সংখ্যাগুলির একটি অলস তালিকা নিন, শূন্যে যোগ করার সময় এগুলি একসাথে ভাঁজ করুন। কোড: ভাঁজ (+) 0 [1..n]। দুঃখিত, মন্তব্যে কোনও বিন্যাস নেই।
dirkt

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

12
     Isn't that the same exact case for procedural programming?

না, কারণ পদ্ধতিগত কোডের পার্শ্ব-প্রতিক্রিয়া থাকতে পারে। উদাহরণস্বরূপ, এটি কলগুলির মধ্যে রাষ্ট্র সঞ্চয় করতে পারে।

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


1
আপনি একটি উদাহরণ এবং তুলনা প্রদর্শন করতে পারেন? আপনি যদি সত্যিই এটি প্রশংসা করতে পারেন।
ফিলোসোফার

8
সি তে র‌্যান্ড () ফাংশন প্রতিটি কলের জন্য আলাদা ফলাফল সরবরাহ করে। এটি কলগুলির মধ্যে রাষ্ট্র সঞ্চয় করে। এটি উল্লেখযোগ্যভাবে স্বচ্ছ নয়। তুলনায়, সি ++ তে স্ট্যান্ড :: সর্বোচ্চ (ক, খ) সর্বদা একই যুক্তি দেখিয়ে একই ফলাফল ফিরে আসবে, এবং এর কোনও পার্শ্ব-প্রতিক্রিয়া নেই (যা আমি জানি ...)।
অ্যান্ডি টমাস

11

আমি ডাব্লু রিচের উত্তরটির সাথে একমত নই। দ্বিধাটি কোথা থেকে এসেছে তা দেখতে আসুন আমরা তার উত্তরটি কিছুটা ডিকনস্ট্রাক্ট করি।

প্রথমত, তার কোড:

function allOdd(words) {
  var result = true;
  for (var i = 0; i < length(words); ++i) {
    var len = length(words[i]);
    if (!odd(len)) {
      result = false;
      break;
    }
  }
  return result;
}

এবং

function allOdd(words) {
  return apply(and, map(compose(odd, length), words));
}

প্রথম যে বিষয়টি তিনি লক্ষ্য করছেন তা হ'ল:

  • ক্রিয়ামূলক
  • এক্সপ্রেশন ওরিয়েন্টেড এবং
  • Iterator কেন্দ্রিক

প্রোগ্রামিং, এবং পুনরাবৃত্ত শৈলী প্রোগ্রামিংয়ের জন্য একটি সাধারণ কার্যকরী শৈলীর চেয়ে আরও সুস্পষ্ট নিয়ন্ত্রণ প্রবাহ থাকার ক্ষমতা অনুপস্থিত।

আসুন দ্রুত এই সম্পর্কে কথা বলা যাক।

এক্সপ্রেশন-কেন্দ্রিক শৈলী এমন এক যেখানে জিনিস যতটা সম্ভব জিনিসগুলিতে মূল্যায়ন করে। যদিও ক্রিয়ামূলক ভাষাগুলি তাদের মতপ্রকাশের ভালবাসার জন্য খ্যাতিযুক্ত, তবে কম্পোজেবল এক্সপ্রেশন ছাড়াই কার্যকরী ভাষা পাওয়া সম্ভব। আমি একটি তৈরি করতে যাচ্ছি, যেখানে কোনও অভিব্যক্তি নেই, নিছক বক্তব্য রয়েছে।

lengths: map words length
each_odd: map lengths odd
all_odd: reduce each_odd and

এটি পূর্বে প্রদত্ত হিসাবে প্রায় একই, কার্যকারিতা বিবৃতি এবং বাইন্ডিংয়ের চেইনের মাধ্যমে বিশুদ্ধভাবে আবদ্ধ হওয়া ব্যতীত pretty

একটি পুনরাবৃত্তি কেন্দ্রিক প্রোগ্রামিং শৈলী পাইথন দ্বারা নেওয়া একটি হতে পারে। আসুন একটি খাঁটি পুনরাবৃত্ত, পুনরাবৃত্তকেন্দ্রিক শৈলী ব্যবহার করুন:

def all_odd(words):
    lengths = (len(word) for word in words)
    each_odd = (odd(length) for length in lengths)
    return all(each_odd)

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

অবশ্যই, আপনি এটি সঙ্কোচন করতে পারেন:

def all_odd(words):
    return all(odd(len(word)) for word in words)

জরুরি এখন এত খারাপ দেখাচ্ছে না, তাই না? :)

চূড়ান্ত পয়েন্টটি ছিল আরও সুস্পষ্ট নিয়ন্ত্রণ প্রবাহ সম্পর্কে। এর ব্যবহার করতে আসল কোডটি আবার লিখি:

function allOdd(words) {
    for (var i = 0; i < length(words); ++i) {
        if (!odd(length(words[i]))) {
            return false;
        }
    }
    return true;
}

পুনরাবৃত্তকারী ব্যবহার করে আপনার থাকতে পারে:

function allOdd(words) {
    for (word : words) { if (!odd(length(word))) { return false; } }
    return true;
}

তাই কি হয় একটি কার্মিক ভাষা বিন্দু যদি পার্থক্য হল:

return all(odd(len(word)) for word in words)
return apply(and, map(compose(odd, length), words))
for (word : words) { if (!odd(length(word))) { return false; } }
return true;


একটি কার্যকরী প্রোগ্রামিং ভাষার প্রধান নির্দিষ্ট বৈশিষ্ট্যটি হ'ল এটি সাধারণত প্রোগ্রামিং মডেলের অংশ হিসাবে পরিবর্তনকে সরিয়ে দেয়। লোকেরা প্রায়শই এটি বোঝায় যে কার্যকরী প্রোগ্রামিং ভাষার কোনও বক্তব্য থাকে না বা এক্সপ্রেশন ব্যবহার হয় না, তবে এগুলি সরলিকরণ। একটি কার্যকরী ভাষা আচরণের ঘোষণার সাথে সুস্পষ্ট গণনার প্রতিস্থাপন করে, যার পরে ভাষাটি হ্রাস করে।

কার্যকারিতার এই উপসেটটিতে নিজেকে সীমাবদ্ধ করা আপনাকে আপনার প্রোগ্রামগুলির আচরণ সম্পর্কে আরও গ্যারান্টি থাকতে দেয় এবং এটি আপনাকে আরও অবাধে রচনা করতে দেয় allows

যখন আপনার একটি কার্যকরী ভাষা থাকে, তখন নতুন ফাংশনগুলি তৈরি করা সাধারণভাবে নিবিড়ভাবে সম্পর্কিত ফাংশনগুলি রচনা করার মতোই সহজ।

all = partial(apply, and)

আপনি যদি কোনও ফাংশনের বিশ্বব্যাপী নির্ভরতা সুস্পষ্টভাবে নিয়ন্ত্রণ না করেন তবে এটি সহজ নয়, এমনকি সম্ভবত সম্ভবও নয়। ফাংশনাল প্রোগ্রামিংয়ের সেরা বৈশিষ্ট্যটি হ'ল আপনি নিয়মিতভাবে আরও জেনেরিক বিমূর্ততা তৈরি করতে পারেন এবং বিশ্বাস করুন যে এগুলি আরও বৃহত্তর সামগ্রীতে একত্রিত করা যায়।


আপনি জানেন, আমি খুব নিশ্চিত যে একটি applyখুব একই রকম অপারেশন নয় foldবা reduceযদিও আমি খুব জেনেরিক অ্যালগরিদম রাখার চমৎকার ক্ষমতাকে সম্মত করি।
বেনিডিক্ট লি

আমি কখনও applyবলতে চাইনি foldবা শুনেছি reduce, তবে এটি আমার কাছে মনে হচ্ছে এটি বুলিয়ান ফিরিয়ে দেওয়ার জন্য এই প্রসঙ্গে থাকতে হবে।
Veedrac

আহ, ঠিক আছে, আমি নামকরণে বিভ্রান্ত হয়ে পড়েছি। এটা পরিষ্কার করার জন্য ধন্যবাদ।
বেনেডিক্ট লি

6

পদ্ধতিগত দৃষ্টান্তে (আমি কি এর পরিবর্তে "স্ট্রাকচার্ড প্রোগ্রামিং" বলব?), আপনি পারস্পরিক পরিবর্তনযোগ্য মেমরি এবং নির্দেশাবলী ভাগ করেছেন যা এটিকে কিছু অনুক্রমে (একের পর এক) পড়ে / লেখেন।

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

(এটি অত্যধিক বর্ণিত, উদাহরণস্বরূপ, এফপিএলগুলিতে সাধারণত পরিবর্তনীয় মেমরির সাথে কাজ করার জন্য সুবিধাগুলি থাকে যদিও পদ্ধতিগত ভাষাগুলি প্রায়শই উচ্চ-ক্রম পদ্ধতিগুলিকে সমর্থন করতে পারে তাই জিনিসগুলি যেমন পরিষ্কার-কাটা না হয়; তবে এটি আপনাকে ধারণা দেয়))


2

চারু পাইথন: পাইথন মধ্যে কার্যকরী প্রোগ্রামিং থেকে আইবিএম Developerworks সত্যিই আমাকে সাহায্য পার্থক্য বুঝতে হবে।

বিশেষত যে কেউ পাইথনকে কিছুটা জানেন, এই নিবন্ধের কোড উদাহরণগুলি যাতে কার্যকরীভাবে এবং পদ্ধতিগতভাবে বিভিন্ন কাজ করা হয় তার বিপরীতে থাকে, প্রক্রিয়াগত এবং কার্যকরী প্রোগ্রামিংয়ের মধ্যে পার্থক্য পরিষ্কার করতে পারে।


2

একটি চিহ্নের অর্থ (পরিবর্তনশীল বা ফাংশন নাম) সম্পর্কে তর্ক করার জন্য ক্রিয়ামূলক প্রোগ্রামিংয়ে আপনাকে কেবল 2 টি জিনিস জানতে হবে - বর্তমান সুযোগ এবং প্রতীকটির নাম। অপরিবর্তনীয়তার সাথে যদি আপনার একটি খাঁটি কার্যকরী ভাষা থাকে তবে এগুলি উভয়ই "স্থিতিশীল" (খারাপভাবে ওভারলোড হওয়া নামটির জন্য দুঃখিত) ধারণাগুলি, যার অর্থ আপনি কেবলমাত্র সোর্স কোডটি দেখে - উভয় - বর্তমান সুযোগ এবং নাম দেখতে পারবেন can

প্রসেসরিয়াল প্রোগ্রামিংয়ে আপনি যদি আপনার পিছনের মূল্য কী তা এই প্রশ্নের উত্তর দিতে চান তবে আপনার xকীভাবে সেখানে পৌঁছেছে তাও জানতে হবে, সুযোগ এবং একাকী নামই যথেষ্ট নয়। এবং এটিই আমি সবচেয়ে বড় চ্যালেঞ্জ হিসাবে দেখব কারণ এই কার্যকরকরণের পথটি একটি "রানটাইম" সম্পত্তি এবং এতগুলি বিভিন্ন বিষয়ের উপর নির্ভর করতে পারে যে বেশিরভাগ লোকেরা কেবল এটি ডিবাগ করতে এবং মৃত্যুদন্ড কার্যকর করার পথটি পুনরুদ্ধার করতে না শিখে।


1

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


0

দুটি প্রোগ্রামিং দৃষ্টান্তের মধ্যে একটি স্পষ্ট পার্থক্য হ'ল রাষ্ট্র।

ফাংশনাল প্রোগ্রামিংয়ে, রাষ্ট্র এড়ানো যায়। সহজ কথায় বলতে গেলে, কোনও ভেরিয়েবল থাকবে না যা একটি মান নির্ধারিত হয়েছে।

উদাহরণ:

def double(x):
    return x * 2

def doubleLst(lst):
    return list(map(double, action))

তবে, প্রসেসিডাল প্রোগ্রামিং স্টেট ব্যবহার করে।

উদাহরণ:

def doubleLst(lst):
    for i in range(len(lst)):
        lst[i] = lst[i] * 2  # assigning of value i.e. mutation of state
    return lst
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.