পদ্ধতিগত প্রোগ্রামিং এবং ফাংশনাল প্রোগ্রামিংয়ের মধ্যে পার্থক্য কী? [বন্ধ]


247

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


উইকিপিডিয়া থেকে বোঝা যায় যে এফপি হ'ল ঘোষণামূলক প্রোগ্রামিংয়ের একটি উপসেট, তবে এটি সত্য নয় এবং আইপি বনাম ডিপি এর সংজ্ঞাটি পূরণ করে
শেলবি মুর তৃতীয়

উত্তর:


151

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

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

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


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


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

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

এটি ভুল বলে মনে হচ্ছে - পদ্ধতিগুলিও নেস্ট করা যেতে পারে, পদ্ধতিগুলির প্যারামিটার থাকতে পারে
হুরদা

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

97

মূলত দুটি শৈলী, যিন এবং ইয়াংয়ের মতো। একটি সংগঠিত, অন্যটি বিশৃঙ্খল। কিছু পরিস্থিতিতে রয়েছে যখন ফাংশনাল প্রোগ্রামিং হ'ল স্পষ্ট পছন্দ, এবং অন্যান্য পরিস্থিতিগুলি ছিল প্রসিডুয়াল প্রোগ্রামিংই ভাল পছন্দ choice এই কারণেই কমপক্ষে দুটি ভাষা রয়েছে যা সম্প্রতি একটি নতুন সংস্করণ নিয়ে এসেছে, যা উভয় প্রোগ্রামিং শৈলীর সাথে জড়িত। ( পার্ল 6 এবং ডি 2 )

প্রথাগত:

  • একটি রুটিনের আউটপুট সর্বদা ইনপুটটির সাথে সরাসরি সম্পর্ক থাকে না।
  • সবকিছু একটি নির্দিষ্ট ক্রমে সম্পন্ন হয়।
  • একটি রুটিন কার্যকর করার পার্শ্ব প্রতিক্রিয়া হতে পারে।
  • রৈখিক ফ্যাশনে সমাধানগুলি প্রয়োগের উপর জোর দেওয়ার ঝোঁক।

পার্ল 6

sub factorial ( UInt:D $n is copy ) returns UInt {

  # modify "outside" state
  state $call-count++;
  # in this case it is rather pointless as
  # it can't even be accessed from outside

  my $result = 1;

  loop ( ; $n > 0 ; $n-- ){

    $result *= $n;

  }

  return $result;
}

ডি 2

int factorial( int n ){

  int result = 1;

  for( ; n > 0 ; n-- ){
    result *= n;
  }

  return result;
}

প্রায়োগিক:

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

Haskell,

( উইকিপিডিয়া থেকে অনুলিপি করা );

fac :: Integer -> Integer

fac 0 = 1
fac n | n > 0 = n * fac (n-1)

বা এক লাইনে:

fac n = if n > 0 then n * fac (n-1) else 1

পার্ল 6

proto sub factorial ( UInt:D $n ) returns UInt {*}

multi sub factorial (  0 ) { 1 }
multi sub factorial ( $n ) { $n * samewith $n-1 } # { $n * factorial $n-1 }

ডি 2

pure int factorial( invariant int n ){
  if( n <= 1 ){
    return 1;
  }else{
    return n * factorial( n-1 );
  }
}

সাইড নোট:

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

sub postfix:< ! > ( UInt:D $n --> UInt )
  is tighter(&infix:<*>)
  { [*] 2 .. $n }

say 5!; # 120␤

এই উদাহরণটি পরিসংখ্যান তৈরি ( 2..$n) এবং তালিকা হ্রাস মেটা-অপারেটর ( [ OPERATOR ] LIST) সংখ্যার ইনফিক্স গুণিত অপারেটরের সাথে মিলিতও দেখায় । ( *)
এটিও দেখায় যে আপনি --> UIntস্বাক্ষরের returns UIntপরে এটির পরিবর্তে রাখতে পারেন।

(আপনি কোনও যুক্তি ছাড়াই কল করলে 2মাল্টিপল "অপারেটর" ফিরে আসবে তাই আপনি পরিসীমা শুরু করে পালিয়ে যেতে পারেন 1)


হাই, আপনি দয়া করে পার্ল fact. তে যুক্তি প্রয়োগের উদাহরণ বিবেচনা করে "কার্যবিধির" জন্য উল্লিখিত নিম্নলিখিত 2 টি পয়েন্টের জন্য একটি উদাহরণ সরবরাহ করতে পারেন? 1) একটি রুটিনের আউটপুট সর্বদা ইনপুটটির সাথে সরাসরি সম্পর্ক থাকে না। 2) একটি রুটিন কার্যকর করার পার্শ্ব প্রতিক্রিয়া হতে পারে।
নাগা কিরণ

sub postfix:<!> ($n) { [*] 1..$n }
ব্র্যাড গিলবার্ট

@ ব্র্যাডগিলবার্ট -ক্যান No operation can have side effectsআপনি দয়া করে এটি বিস্তারিতভাবে বর্ণনা করতে পারেন?
কুশলভম

2
সম্ভবত আমি খুঁজে পেতে পারে সবচেয়ে ভাল উত্তর .... এবং, আমি সেই স্বতন্ত্র পয়েন্ট সম্পর্কে কিছু গবেষণা করেছি .. যা আমাকে সত্যিই সাহায্য করেছিল! :)
নবনেথ

1
@ আকাশবিসারিয়া sub foo( $a, $b ){ ($a,$b).pick }always সর্বদা একই ইনপুটটির জন্য একই আউটপুট ফেরত দেয় না, যখন নিম্নলিখিতগুলি করেনsub foo( $a, $b ){ $a + $b }
ব্র্যাড গিলবার্ট

70

আমি এই সংজ্ঞাটি অন্য কোথাও কখনও দেখিনি, তবে আমি মনে করি এটি এখানে প্রদত্ত পার্থক্যগুলি মোটামুটিভাবে সমষ্টি করে:

ক্রিয়ামূলক প্রোগ্রামিং এক্সপ্রেশন উপর দৃষ্টি নিবদ্ধ করে

পদ্ধতিগত প্রোগ্রামিং বিবৃতি উপর দৃষ্টি নিবদ্ধ করে

এক্সপ্রেশন মান আছে। একটি কার্যনির্বাহী প্রোগ্রাম হ'ল একটি অভিব্যক্তি যা এর মূল্য কম্পিউটারের জন্য চালিত নির্দেশাবলীর ক্রম।

বিবৃতিগুলির মান থাকে না এবং পরিবর্তে কিছু ধারণামূলক মেশিনের স্থিতি পরিবর্তন করে।

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

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

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

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

আপনি এখনও কোনও ভাষায় কার্যকরী শৈলীতে লিখতে পারেন যা পদ্ধতিগত দৃষ্টান্তকে উত্সাহ দেয় এবং বিপরীতে। এটি একটি দৃষ্টান্তে লেখার পক্ষে আরও শক্ত এবং / বা আরও বিশ্রী যা ভাষা দ্বারা উত্সাহিত হয় না।


2
ওয়েবে আমি দেখেছি সেরা এবং সর্বাধিক সংক্ষিপ্ত বিবরণ, ব্র্যাভো!
10-15

47

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


4
যদিও এটি সেই ব্যাখ্যাটি যা আমাকে সবচেয়ে বেশি সাহায্য করেছে, তবুও আমি কার্যকরী প্রোগ্রামিংয়ের ধারণাকে নিয়ে অস্পষ্ট। আমি এমন স্টাইলিংয়ের সন্ধান করছি যা চালানোর জন্য বাহ্যিক অবজেক্টের রেফারেন্সের উপর নির্ভর করে না (প্রতিটি জিনিস ফাংশনটি চালাতে হবে এটি প্যারামিটার হিসাবে পাস করা উচিত)। উদাহরণস্বরূপ, আমি কখনই GetUserContext()ফাংশনটি রাখব না, ব্যবহারকারীর প্রসঙ্গটি পাস হয়ে যাবে this এই কার্যকরী প্রোগ্রামিংটি কি? আগাম ধন্যবাদ.
ম্যাট ক্যাস্যাট

26

আমি বিশ্বাস করি যে পদ্ধতিগত / কার্যকরী / উদ্দেশ্যমূলক প্রোগ্রামিং কীভাবে কোনও সমস্যার কাছে যেতে পারে are

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

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

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


26

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

num = 1 
def function_to_add_one(num):
    num += 1
    return num


function_to_add_one(num)
function_to_add_one(num)
function_to_add_one(num)
function_to_add_one(num)
function_to_add_one(num)

#Final Output: 2

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

num = 1 
def procedure_to_add_one():
    global num
    num += 1
    return num


procedure_to_add_one()
procedure_to_add_one()
procedure_to_add_one()
procedure_to_add_one()
procedure_to_add_one()

#Final Output: 6

function_to_add_one একটি ফাংশন

procedure_to_add_one একটি পদ্ধতি

এমনকি আপনি পাঁচবার ফাংশনটি চালালেও প্রতিবার এটি ফিরে আসবে 2

আপনি যদি পাঁচবার পদ্ধতিটি চালনা করেন তবে পঞ্চম রান শেষে এটি আপনাকে 6 দেয়


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

13

কনরাদের মন্তব্যে প্রসারিত করতে:

ফলস্বরূপ, একটি খাঁটি কার্যকরী প্রোগ্রাম সর্বদা ইনপুটটির জন্য একই মান দেয় এবং মূল্যায়নের ক্রমটি যথাযথভাবে সংজ্ঞায়িত হয় না;

এর কারণে, কার্যকরী কোড সমান্তরাল করা সহজ। যেহেতু (সাধারণত) কোনও কার্যকারিতাগুলির কোনও পার্শ্ব প্রতিক্রিয়া নেই এবং তারা (সাধারণত) কেবল তাদের যুক্তিগুলিতে কাজ করে, তাই অনেকগুলি সম্মতিমূলক সমস্যা চলে যায়।

যখন আপনার কোডটি সঠিক প্রমাণ করার জন্য সক্ষম হতে হবে তখন কার্যকরী প্রোগ্রামিংও ব্যবহার করা হয়। পদ্ধতিগত প্রোগ্রামিংয়ের সাথে এটি করা খুব কঠিন (কার্যক্ষমতার সাথে সহজ নয়, তবে আরও সহজ)।

দাবি অস্বীকার: আমি বছরগুলিতে ফাংশনাল প্রোগ্রামিং ব্যবহার করি নি, এবং সম্প্রতি সম্প্রতি এটি আবার দেখা শুরু করেছি, তাই আমি এখানে পুরোপুরি সঠিক হতে পারি না। :)


12

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

fac n = foldr (*) 1 [1..n]

সুস্পষ্ট পুনরাবৃত্তি ব্যবহারের চেয়ে একটি লুপ ব্যবহার করার সাথে একটি নিখুঁতভাবে আইডোমেটিক নির্মাণ এবং আত্মার আরও কাছাকাছি।


10

একটি কার্যনির্বাহী প্রোগ্রামিং পদ্ধতিগত প্রোগ্রামিংয়ের সমান, যেখানে বৈশ্বিক চলকগুলি ব্যবহার করা হচ্ছে না


7

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

পুনরাবৃত্তি ফাংশনাল স্টাইল প্রোগ্রামিংয়ের একটি সর্বোত্তম উদাহরণ।


1
এই পৃষ্ঠাটি পড়ার পরে আমি একই জিনিসটি নিয়ে ভাবছিলাম -> "পুনরাবৃত্তি ফাংশনাল স্টাইল প্রোগ্রামিংয়ের একটি সর্বোত্তম উদাহরণ", এবং আপনি এটি সাফ করেছেন han ধন্যবাদ, এখন আমি ভাবছি কিছু পেয়ে যাচ্ছি।
মুদাসসির হুসেন

6

কনরাড বলেছেন:

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

একটি বিশুদ্ধ কার্যকরী প্রোগ্রামের মূল্যায়নের ক্রমটি (বিশেষত অলসতার সাথে) বা এমনকি গুরুত্বহীন সম্পর্কে তর্ক করা শক্ত (এআর) হতে পারে তবে আমি মনে করি যে এটি সঠিকভাবে সংজ্ঞায়িত করা হয়নি বলে এটি আপনার শব্দটির মতো শোনাচ্ছে যা আপনার প্রোগ্রামটি চলছে কিনা তা আপনি বলতে পারবেন না sound আদৌ কাজ করতে!

সম্ভবত আরও ভাল ব্যাখ্যা হতে পারে যে কার্যকরী প্রোগ্রামগুলিতে নিয়ন্ত্রণ প্রবাহ যখন কোনও ফাংশনের যুক্তির মান প্রয়োজন হয় তার উপর ভিত্তি করে। এ সম্পর্কে ভাল জিনিস যা ভাল লিখিত প্রোগ্রামগুলিতে, রাষ্ট্র স্পষ্ট হয়: প্রতিটি ফাংশন তার ইনপুটগুলিকে নির্বিচারে পরিবর্তনের পরিবর্তে পরামিতি হিসাবে তালিকাভুক্ত করে বিশ্বব্যাপী রাষ্ট্রকে munging । সুতরাং কিছু স্তরে, একবারে একটি ফাংশন সম্মানের সাথে মূল্যায়নের ক্রম সম্পর্কে যুক্তিযুক্ত করা সহজ । প্রতিটি ফাংশন বাকি মহাবিশ্বকে উপেক্ষা করতে পারে এবং এর কী করা দরকার তা সম্পর্কে ফোকাস করতে পারে। একত্রিত হলে, ফাংশনগুলি বিচ্ছিন্নভাবে একইভাবে কাজ করার গ্যারান্টিযুক্ত [1]।

... ব্যবহারকারী ইনপুট বা এলোমেলো মানগুলির মতো অনিশ্চিত মানগুলি খাঁটি কার্যকরী ভাষায় মডেল করা শক্ত।

খাঁটি কার্যকরী প্রোগ্রামগুলির ইনপুট সমস্যার সমাধান হ'ল একটি আবশ্যক ভাষা এম্বেড করা যথেষ্ট শক্তিশালী বিমূর্ততা ব্যবহার করে ডিএসএল । অপরিহার্য (বা খাঁটি অ-কার্যকরী) ভাষাগুলিতে এটির প্রয়োজন নেই কারণ আপনি "প্রতারণা" করতে পারেন এবং স্পষ্টভাবে রাষ্ট্রকে উত্তীর্ণ করতে পারেন এবং মূল্যায়নের ক্রমটি সুস্পষ্ট (আপনার পছন্দ হোক বা না হোক)। এই "প্রতারণা" এবং প্রতিটি ক্রিয়াকলাপের সমস্ত পরামিতিগুলির জোরপূর্বক মূল্যায়নের কারণে, 1 অপরিহার্য ভাষায়) আপনি নিজের নিয়ন্ত্রণ প্রবাহ প্রক্রিয়াটি তৈরি করার ক্ষমতা হারাবেন (ম্যাক্রো ছাড়াই), ২) কোডটি সহজাতভাবে থ্রেডকে নিরাপদ এবং / অথবা সমান্তরালযোগ্য নয় গতানুগতিক, 3) এবং পূর্বাবস্থায় ফিরিয়ে আনার (সময় ভ্রমণের) মতো কিছু বাস্তবায়ন করা সতর্কতার সাথে কাজ করে (আবশ্যক প্রোগ্রামার অবশ্যই পুরানো মান (গুলি) ফেরত পাওয়ার জন্য একটি রেসিপি সংরক্ষণ করতে পারে!) যেখানে খাঁটি ফাংশনাল প্রোগ্রামিং আপনাকে এই সমস্ত জিনিস কিনে দেয় a এবং আরও কয়েকটি আমি করতে পারি "বিনামূল্যে জন্য" ভুলে গেছে।

আমি আশা করি এটি উদ্যোগীতার মতো শোনাচ্ছে না, আমি কিছুটা দৃষ্টিকোণ যুক্ত করতে চেয়েছিলাম। সি # 3.0 এর মতো শক্তিশালী ভাষায় ইমপিরিটিভ প্রোগ্রামিং এবং বিশেষত মিশ্র দৃষ্টান্তমূলক প্রোগ্রামিংগুলি জিনিসগুলি সম্পন্ন করার এখনও সম্পূর্ণ কার্যকর উপায় এবং কোনও রূপালী বুলেট নেই

[1] ... সম্ভবত সম্মানের মেমরির ব্যবহার ছাড়া (হাসিলে সিএফ। ভাঁজ এবং ভাঁজ ')।


5

কনরাদের মন্তব্যে প্রসারিত করতে:

এবং মূল্যায়নের ক্রমটি সংজ্ঞায়িত হয় না

কিছু কার্যকরী ভাষায় অলস মূল্যায়ন বলা হয়। যার অর্থ একটি ক্রিয়াকলাপটি কার্যকর না হওয়া অবধি কার্যকর করা হয় না। সেই সময় অবধি ফাংশনটি হ'ল চারপাশে যা ঘটে।

পদ্ধতিগত ভাষাগুলি হল পদক্ষেপ 1 ধাপ 2 পদক্ষেপ 3 ... যদি পদক্ষেপ 2 এ আপনি 2 + 2 যোগ করার কথা বলেন, এটি ঠিক তখনই তা করে। অলস মূল্যায়নে আপনি বলবেন 2 + 2 যোগ করুন, তবে ফলাফলটি যদি কখনও ব্যবহার না করা হয় তবে এটি কখনই সংযোজন করে না।


4

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

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

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


3

@Creighton:

হাস্কেলে পণ্য নামে পরিচিত একটি লাইব্রেরি ফাংশন রয়েছে :

prouduct list = foldr 1 (*) list

বা সহজভাবে:

product = foldr 1 (*)

সুতরাং "আইডোমেটিক" ফ্যাটোরিয়াল

fac n = foldr 1 (*)  [1..n]

সহজভাবে হবে

fac n = product [1..n]

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

আমি বিশ্বাস করি এটি অনেক বছর আগে পোস্ট করা হয়েছিল, মন্তব্য সিস্টেমটি যুক্ত হওয়ার আগে, আপনি যদি এটি বিশ্বাস করতে পারেন: stackoverflow.com/help/badges/30/beta?userid=2543
জ্যারেড আপডেটিকে

2

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

ফাংশনাল প্রোগ্রামিং হ'ল ফাংশনগুলি প্রথম শ্রেণির মানগুলি ব্যতীত তাই সেগুলি অন্যান্য ফাংশনে আর্গুমেন্ট হিসাবে পাস করা যায় এবং ফাংশন কলগুলির ফলাফল হিসাবে ফিরে আসতে পারে।

নোট করুন যে কার্যকরী প্রোগ্রামিং হ'ল এই ব্যাখ্যায় পদ্ধতিগত প্রোগ্রামিংয়ের সাধারণীকরণ। তবে একটি সংখ্যালঘু "ফাংশনাল প্রোগ্রামিং" এর অর্থ পার্শ্ব-প্রভাব-মুক্ত বলতে বোঝায় যা হাস্কেল ব্যতীত সমস্ত প্রধান কার্যকরী ভাষার ক্ষেত্রে একেবারেই আলাদা তবে অপ্রাসঙ্গিক।


1

পার্থক্যটি বোঝার জন্য, আপনার বুঝতে হবে যে পদ্ধতিগত এবং কার্যকরী প্রোগ্রামিং উভয়ের "গডফাদার" দৃষ্টান্তটি একটি অত্যাবশ্যক প্রোগ্রামিং

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

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

PS: প্রতিটি প্রোগ্রামিং দৃষ্টান্ত বোঝার জন্য তাদের সকলের মধ্যে পার্থক্য পরিষ্কার করা উচিত।

পিএসএস: দিনের শেষে, প্রোগ্রামিং প্যারাডিমগুলি সমস্যা সমাধানের জন্য কেবল ভিন্ন ভিন্ন পদ্ধতি।

পিএসএস: এই কোরা উত্তরের একটি দুর্দান্ত ব্যাখ্যা রয়েছে।


0

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

বলুন আপনার কাছে স্ট্রিংগুলির একটি অ্যারে রয়েছে এবং প্রতিটি স্ট্রিং "5" বা "-200" এর মতো একটি পূর্ণসংখ্যা উপস্থাপন করে। আপনি আপনার অভ্যন্তরীণ পরীক্ষার ক্ষেত্রে (পূর্ণসংখ্যার তুলনা ব্যবহার করে) স্ট্রিংগুলির এই ইনপুট অ্যারেটি পরীক্ষা করতে চান। উভয় সমাধান নীচে দেখানো হয়েছে

প্রথাগত

arr_equal(a : [Int], b : [Str]) -> Bool {
    if(a.len != b.len) {
        return false;
    }

    bool ret = true;
    for( int i = 0; i < a.len /* Optimized with && ret*/; i++ ) {
        int a_int = a[i];
        int b_int = parseInt(b[i]);
        ret &= a_int == b_int;  
    }
    return ret;
}

ক্রিয়ামূলক

eq = i, j => i == j # This is usually a built-in
toInt = i => parseInt(i) # Of course, parseInt === toInt here, but this is for visualization

arr_equal(a : [Int], b : [Str]) -> Bool =
    zip(a, b.map(toInt)) # Combines into [Int, Int]
   .map(eq)
   .reduce(true, (i, j) => i && j) # Start with true, and continuously && it with each value

খাঁটি কার্যকরী ভাষা সাধারণত গবেষণার ভাষা হয় (যেমন বাস্তব-জগতে নিখরচায় পার্শ্ব-প্রতিক্রিয়া পছন্দ করে), বাস্তব-বিশ্ব প্রক্রিয়াগত ভাষাগুলি যখন উপযুক্ত হয় তত বেশি সরল কার্যকরী বাক্য গঠন ব্যবহার করবে।

সাধারণত মত একটি বহিস্থিত লাইব্রেরির সাথে বাস্তবায়িত হয় Lodash , বা উপলব্ধ বিল্ট-ইন মত নতুন ভাষার সঙ্গে মরচে । ক্রিয়ামূলক প্রোগ্রামিং ভারী উত্তোলন মতো কাজগুলির / ধারণার সঙ্গে সম্পন্ন করা হয় map, filter, reduce, currying,partial , যার মধ্যে গত তিন আপনি আপ আরও বোঝার জন্য সন্ধান করতে পারেন।

অভিযোজ্য বস্তু

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.