আমি পদ্ধতিগত প্রোগ্রামিং এবং ফাংশনাল প্রোগ্রামিং উভয়ের জন্য উইকিপিডিয়া নিবন্ধগুলি পড়েছি , তবে আমি এখনও কিছুটা বিভ্রান্ত। কেউ কি এটি সিদ্ধ করতে পারে?
আমি পদ্ধতিগত প্রোগ্রামিং এবং ফাংশনাল প্রোগ্রামিং উভয়ের জন্য উইকিপিডিয়া নিবন্ধগুলি পড়েছি , তবে আমি এখনও কিছুটা বিভ্রান্ত। কেউ কি এটি সিদ্ধ করতে পারে?
উত্তর:
একটি কার্যকরী ভাষা (আদর্শভাবে) আপনাকে গাণিতিক ফাংশন লিখতে দেয়, অর্থাত্ একটি ফাংশন যা এন আর্গুমেন্ট নেয় এবং একটি মান ফেরত দেয়। প্রোগ্রামটি কার্যকর করা হলে এই ফাংশনটি প্রয়োজনীয়ভাবে যুক্তিযুক্তভাবে মূল্যায়ন করা হয়। 1
অন্যদিকে, একটি পদ্ধতিগত ভাষা ক্রমক্রমিক পদক্ষেপগুলির একটি সিরিজ সম্পাদন করে । (ক্রমবর্ধমান লজিককে ক্রিয়ামূলক যুক্তিতে রূপান্তর করার একটি উপায় রয়েছে যার নাম ধারাবাহিকতা পাসিং স্টাইল )
ফলস্বরূপ, একটি খাঁটি কার্যকরী প্রোগ্রাম সর্বদা একটি ইনপুটটির জন্য একই মান দেয় এবং মূল্যায়নের ক্রমটি যথাযথভাবে সংজ্ঞায়িত হয় না; যার অর্থ যে ব্যবহারকারী ইনপুট বা এলোমেলো মানগুলির মতো অনিশ্চিত মানগুলি বিশুদ্ধভাবে কার্যকরী ভাষায় মডেল করা শক্ত।
1 এই উত্তরের সমস্ত কিছু হিসাবে, এটি একটি সাধারণীকরণ। এই সম্পত্তি, যখন কোনও ফলাফলের প্রয়োজন হয় যেখানে এটি বলা হয় না তার পরিবর্তে ক্রমশ প্রয়োজন হয় যখন একটি গণনার মূল্যায়ন করে, "আলস্যতা" হিসাবে পরিচিত। সমস্ত কার্যকরী ভাষা আসলে সর্বজনীন অলস নয়, অলসতা কেবল কার্যকরী প্রোগ্রামিংয়ের মধ্যেই সীমাবদ্ধ নয়। বরং, এখানে বর্ণিত বিবরণটি বিভিন্ন প্রোগ্রামিং শৈলীর স্বতন্ত্র এবং বিপরীত বিভাগ নয় বরং তরল ধারণার জন্য চিন্তা করার জন্য একটি "মানসিক কাঠামো" সরবরাহ করে।
মূলত দুটি শৈলী, যিন এবং ইয়াংয়ের মতো। একটি সংগঠিত, অন্যটি বিশৃঙ্খল। কিছু পরিস্থিতিতে রয়েছে যখন ফাংশনাল প্রোগ্রামিং হ'ল স্পষ্ট পছন্দ, এবং অন্যান্য পরিস্থিতিগুলি ছিল প্রসিডুয়াল প্রোগ্রামিংই ভাল পছন্দ choice এই কারণেই কমপক্ষে দুটি ভাষা রয়েছে যা সম্প্রতি একটি নতুন সংস্করণ নিয়ে এসেছে, যা উভয় প্রোগ্রামিং শৈলীর সাথে জড়িত। ( পার্ল 6 এবং ডি 2 )
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;
}
int factorial( int n ){
int result = 1;
for( ; n > 0 ; n-- ){
result *= n;
}
return result;
}
( উইকিপিডিয়া থেকে অনুলিপি করা );
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
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 }
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
)
sub postfix:<!> ($n) { [*] 1..$n }
No operation can have side effects
আপনি দয়া করে এটি বিস্তারিতভাবে বর্ণনা করতে পারেন?
sub foo( $a, $b ){ ($a,$b).pick }
always সর্বদা একই ইনপুটটির জন্য একই আউটপুট ফেরত দেয় না, যখন নিম্নলিখিতগুলি করেনsub foo( $a, $b ){ $a + $b }
আমি এই সংজ্ঞাটি অন্য কোথাও কখনও দেখিনি, তবে আমি মনে করি এটি এখানে প্রদত্ত পার্থক্যগুলি মোটামুটিভাবে সমষ্টি করে:
ক্রিয়ামূলক প্রোগ্রামিং এক্সপ্রেশন উপর দৃষ্টি নিবদ্ধ করে
পদ্ধতিগত প্রোগ্রামিং বিবৃতি উপর দৃষ্টি নিবদ্ধ করে
এক্সপ্রেশন মান আছে। একটি কার্যনির্বাহী প্রোগ্রাম হ'ল একটি অভিব্যক্তি যা এর মূল্য কম্পিউটারের জন্য চালিত নির্দেশাবলীর ক্রম।
বিবৃতিগুলির মান থাকে না এবং পরিবর্তে কিছু ধারণামূলক মেশিনের স্থিতি পরিবর্তন করে।
নিখুঁত ক্রিয়ামূলক ভাষায় কোনও বক্তব্য থাকবে না, এই অর্থে যে রাষ্ট্রকে কারচুপি করার কোনও উপায় নেই (তাদের কাছে এখনও "স্টেটমেন্ট" নামক একটি সিনট্যাকটিক নির্মাণ থাকতে পারে, তবে যদি এটি রাষ্ট্রের সাথে সামঞ্জস্য না করে আমি এই অর্থে এটিকে একটি বিবৃতি বলব না )। খাঁটি প্রক্রিয়াজাতীয় ভাষায় কোনও অভিব্যক্তি থাকবে না, সবকিছুই এমন একটি নির্দেশনা হবে যা মেশিনের অবস্থাকে পরিচালনা করে।
হাস্কেল খাঁটি কার্যকরী ভাষার উদাহরণ হতে পারে কারণ রাষ্ট্রকে কারসাজির করার কোনও উপায় নেই। মেশিন কোড একটি নিখুঁত পদ্ধতিগত ভাষার উদাহরণ হতে পারে কারণ একটি প্রোগ্রামের সমস্ত কিছুই একটি বিবৃতি যা মেশিনের রেজিস্ট্রার এবং মেমরির অবস্থাকে পরিচালনা করে ulates
বিভ্রান্তিমূলক অংশটি হ'ল প্রোগ্রামিং ভাষার বিশাল অংশে উভয় মত প্রকাশ এবং বিবৃতি থাকে যা আপনাকে দৃষ্টান্ত মিশ্রিত করতে দেয়। ভাষাগুলি বনাম প্রকাশের ক্ষেত্রে তারা কতটা উত্সাহিত করে তার উপর ভিত্তি করে ভাষাগুলিকে আরও কার্যকরী বা আরও প্রক্রিয়াগত হিসাবে শ্রেণীবদ্ধ করা যেতে পারে।
উদাহরণস্বরূপ, সিওবিএল-এর তুলনায় সি আরও কার্যকরী হবে কারণ একটি ফাংশন কল একটি অভিব্যক্তি, যেখানে সিওবিএল-এ একটি উপ-প্রোগ্রামকে কল করা একটি বিবৃতি (যা ভাগযুক্ত ভেরিয়েবলের অবস্থাকে ম্যানিপুলেট করে এবং কোনও মান ফেরত দেয় না)। পাইথন সি এর চেয়ে বেশি কার্যকরী হবে কারণ এটি আপনাকে শর্ট সার্কিট মূল্যায়ন (পরীক্ষা ও& পাঠ 1 || পথ 2 এর বিপরীতে যেমন বিবৃতি দেয়) ব্যবহার করে শর্তযুক্ত যুক্তি প্রকাশ করতে দেয় as পাইথনের চেয়ে স্কিম আরও কার্যকরী হবে কারণ স্কিমের সমস্ত কিছুই একটি অভিব্যক্তি।
আপনি এখনও কোনও ভাষায় কার্যকরী শৈলীতে লিখতে পারেন যা পদ্ধতিগত দৃষ্টান্তকে উত্সাহ দেয় এবং বিপরীতে। এটি একটি দৃষ্টান্তে লেখার পক্ষে আরও শক্ত এবং / বা আরও বিশ্রী যা ভাষা দ্বারা উত্সাহিত হয় না।
কম্পিউটার সায়েন্সে, ফাংশনাল প্রোগ্রামিং হ'ল একটি প্রোগ্রামিং দৃষ্টান্ত যা গণনা গণিতের ক্রিয়াকলাপগুলির মূল্যায়ন হিসাবে গণ্য করে এবং রাষ্ট্র এবং পরিবর্তনীয় ডেটা এড়ায়। এটি কার্যবিধির প্রয়োগের উপর জোর দেয়, প্রক্রিয়াজাত প্রোগ্রামিং স্টাইলের বিপরীতে যা রাজ্যে পরিবর্তনগুলিকে জোর দেয়।
GetUserContext()
ফাংশনটি রাখব না, ব্যবহারকারীর প্রসঙ্গটি পাস হয়ে যাবে this এই কার্যকরী প্রোগ্রামিংটি কি? আগাম ধন্যবাদ.
আমি বিশ্বাস করি যে পদ্ধতিগত / কার্যকরী / উদ্দেশ্যমূলক প্রোগ্রামিং কীভাবে কোনও সমস্যার কাছে যেতে পারে are
প্রথম স্টাইলটি প্রতিটি পদক্ষেপে পরিকল্পনা করবে এবং একবারে এক ধাপ (একটি পদ্ধতি) প্রয়োগ করে সমস্যাটি সমাধান করবে। অন্যদিকে, কার্যকরী প্রোগ্রামিং বিভাজন এবং বিজয়ী পদ্ধতির উপর জোর দেয়, যেখানে সমস্যাটি সাব-সমস্যায় বিভক্ত হয়, তারপরে প্রতিটি উপ-সমস্যা সমাধান করা হয় (সেই উপ সমস্যা সমাধানের জন্য একটি ফাংশন তৈরি করা) এবং ফলাফলগুলি একত্রিত হয় পুরো সমস্যার জন্য উত্তর তৈরি করুন। অবশেষে, অবজেক্টিভ প্রোগ্রামিং কম্পিউটারের অভ্যন্তরে অনেকগুলি অবজেক্টের সাথে একটি মিনি-ওয়ার্ল্ড তৈরি করে আসল বিশ্বের অনুকরণ করবে, যার প্রতিটিটিরই কিছুটা (কিছুটা) অনন্য বৈশিষ্ট্য রয়েছে এবং অন্যের সাথে ইন্টারেক্ট হয়। এই মিথস্ক্রিয়া থেকে ফলাফল উদ্ভূত হবে।
প্রোগ্রামিংয়ের প্রতিটি স্টাইলের নিজস্ব সুবিধা এবং দুর্বলতা রয়েছে। সুতরাং, "বিশুদ্ধ প্রোগ্রামিং" এর মতো কিছু করা (যেমন নিখুঁত পদ্ধতিগত - কেউ এগুলি করে না, যা একরকম অদ্ভুত - বা খাঁটিভাবে কার্যকরী বা খাঁটি উদ্দেশ্য) বিশেষত কিছু প্রাথমিক সমস্যা ব্যতীত অসম্ভব না হলেও খুব কঠিন specially প্রোগ্রামিং শৈলীর সুবিধা প্রদর্শন করার জন্য ডিজাইন করা হয়েছে (অতএব, আমরা যারা শুদ্ধতা পছন্দ করি তাদের ডাকি: ডি)।
তারপরে, সেই শৈলীগুলি থেকে, আমাদের কাছে প্রোগ্রামিং ভাষা রয়েছে যা প্রতিটি স্টাইলের জন্য অনুকূলিত করার জন্য ডিজাইন করা হয়েছে। উদাহরণস্বরূপ, সমাবেশ সমস্ত পদ্ধতিগত সম্পর্কে about ঠিক আছে, বেশিরভাগ প্রাথমিক ভাষাগুলি প্রক্রিয়াগত হয়, কেবল অসম নয়, সি, পাস্কাল, (এবং ফোর্টরান, আমি শুনেছি)। তারপরে, আমাদের অবজেক্টিভ স্কুলে সমস্ত বিখ্যাত জাভা রয়েছে (আসলে, জাভা এবং সি # এছাড়াও "অর্থ-ভিত্তিক" নামে একটি ক্লাসে রয়েছে তবে এটি অন্য একটি আলোচনার বিষয়)। এছাড়াও উদ্দেশ্য ছোট ছোট কথা। ফাংশনাল স্কুলে, আমরা "প্রায় কার্যকরী" থাকতাম (তাদের কেউ কেউ অশুচি বলে বিবেচনা করতেন) লিস্প পরিবার এবং এমএল পরিবার এবং অনেকগুলি "খাঁটিভাবে কার্যকরী" হাস্কেল, এরলং, ইত্যাদি। ওয়েল, পার্ল, পাইথনের মতো অনেকগুলি সাধারণ ভাষা রয়েছে are , রুবি
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 দেয় ।
কনরাদের মন্তব্যে প্রসারিত করতে:
ফলস্বরূপ, একটি খাঁটি কার্যকরী প্রোগ্রাম সর্বদা ইনপুটটির জন্য একই মান দেয় এবং মূল্যায়নের ক্রমটি যথাযথভাবে সংজ্ঞায়িত হয় না;
এর কারণে, কার্যকরী কোড সমান্তরাল করা সহজ। যেহেতু (সাধারণত) কোনও কার্যকারিতাগুলির কোনও পার্শ্ব প্রতিক্রিয়া নেই এবং তারা (সাধারণত) কেবল তাদের যুক্তিগুলিতে কাজ করে, তাই অনেকগুলি সম্মতিমূলক সমস্যা চলে যায়।
যখন আপনার কোডটি সঠিক প্রমাণ করার জন্য সক্ষম হতে হবে তখন কার্যকরী প্রোগ্রামিংও ব্যবহার করা হয়। পদ্ধতিগত প্রোগ্রামিংয়ের সাথে এটি করা খুব কঠিন (কার্যক্ষমতার সাথে সহজ নয়, তবে আরও সহজ)।
দাবি অস্বীকার: আমি বছরগুলিতে ফাংশনাল প্রোগ্রামিং ব্যবহার করি নি, এবং সম্প্রতি সম্প্রতি এটি আবার দেখা শুরু করেছি, তাই আমি এখানে পুরোপুরি সঠিক হতে পারি না। :)
একটি জিনিস যা আমি এখানে সত্যই জোর দিয়ে দেখিনি তা হ'ল হ্যাস্কেলের মতো আধুনিক কার্যকরী ভাষাগুলি স্পষ্ট নিয়ন্ত্রণের চেয়ে প্রবাহ নিয়ন্ত্রণের জন্য প্রথম শ্রেণির ফাংশনগুলিতে আরও বেশি। আপনার উপরের মতো হাস্কেলতে পুনরাবৃত্তভাবে ফ্যাক্টরিয়াল সংজ্ঞা দেওয়ার দরকার নেই। আমি কিছু মনে করি
fac n = foldr (*) 1 [1..n]
সুস্পষ্ট পুনরাবৃত্তি ব্যবহারের চেয়ে একটি লুপ ব্যবহার করার সাথে একটি নিখুঁতভাবে আইডোমেটিক নির্মাণ এবং আত্মার আরও কাছাকাছি।
পদ্ধতিগত ভাষাগুলিতে রাষ্ট্রের ট্র্যাক রাখা (ভেরিয়েবলগুলি ব্যবহার করে) থাকে এবং ধাপগুলির ক্রম হিসাবে চালানো হয়। বিশুদ্ধভাবে কার্যকরী ভাষাগুলি রাষ্ট্রের উপর নজর রাখে না, পরিবর্তনীয় মানগুলি ব্যবহার করে না এবং নির্ভরতার একটি সিরিজ হিসাবে চালিত করার প্রবণতা রাখে। অনেক ক্ষেত্রে কল স্ট্যাকের স্থিতি এমন তথ্য রাখে যা প্রসেসিয়াল কোডে স্টেট ভেরিয়েবেলে সংরক্ষণ করা হবে তার সমতুল্য।
পুনরাবৃত্তি ফাংশনাল স্টাইল প্রোগ্রামিংয়ের একটি সর্বোত্তম উদাহরণ।
কনরাড বলেছেন:
ফলস্বরূপ, একটি খাঁটি কার্যকরী প্রোগ্রাম সর্বদা ইনপুটটির জন্য একই মান দেয় এবং মূল্যায়নের ক্রমটি যথাযথভাবে সংজ্ঞায়িত হয় না; যার অর্থ যে ব্যবহারকারী ইনপুট বা এলোমেলো মানগুলির মতো অনিশ্চিত মানগুলি বিশুদ্ধভাবে কার্যকরী ভাষায় মডেল করা শক্ত।
একটি বিশুদ্ধ কার্যকরী প্রোগ্রামের মূল্যায়নের ক্রমটি (বিশেষত অলসতার সাথে) বা এমনকি গুরুত্বহীন সম্পর্কে তর্ক করা শক্ত (এআর) হতে পারে তবে আমি মনে করি যে এটি সঠিকভাবে সংজ্ঞায়িত করা হয়নি বলে এটি আপনার শব্দটির মতো শোনাচ্ছে যা আপনার প্রোগ্রামটি চলছে কিনা তা আপনি বলতে পারবেন না sound আদৌ কাজ করতে!
সম্ভবত আরও ভাল ব্যাখ্যা হতে পারে যে কার্যকরী প্রোগ্রামগুলিতে নিয়ন্ত্রণ প্রবাহ যখন কোনও ফাংশনের যুক্তির মান প্রয়োজন হয় তার উপর ভিত্তি করে। এ সম্পর্কে ভাল জিনিস যা ভাল লিখিত প্রোগ্রামগুলিতে, রাষ্ট্র স্পষ্ট হয়: প্রতিটি ফাংশন তার ইনপুটগুলিকে নির্বিচারে পরিবর্তনের পরিবর্তে পরামিতি হিসাবে তালিকাভুক্ত করে বিশ্বব্যাপী রাষ্ট্রকে munging । সুতরাং কিছু স্তরে, একবারে একটি ফাংশন সম্মানের সাথে মূল্যায়নের ক্রম সম্পর্কে যুক্তিযুক্ত করা সহজ । প্রতিটি ফাংশন বাকি মহাবিশ্বকে উপেক্ষা করতে পারে এবং এর কী করা দরকার তা সম্পর্কে ফোকাস করতে পারে। একত্রিত হলে, ফাংশনগুলি বিচ্ছিন্নভাবে একইভাবে কাজ করার গ্যারান্টিযুক্ত [1]।
... ব্যবহারকারী ইনপুট বা এলোমেলো মানগুলির মতো অনিশ্চিত মানগুলি খাঁটি কার্যকরী ভাষায় মডেল করা শক্ত।
খাঁটি কার্যকরী প্রোগ্রামগুলির ইনপুট সমস্যার সমাধান হ'ল একটি আবশ্যক ভাষা এম্বেড করা যথেষ্ট শক্তিশালী বিমূর্ততা ব্যবহার করে ডিএসএল । অপরিহার্য (বা খাঁটি অ-কার্যকরী) ভাষাগুলিতে এটির প্রয়োজন নেই কারণ আপনি "প্রতারণা" করতে পারেন এবং স্পষ্টভাবে রাষ্ট্রকে উত্তীর্ণ করতে পারেন এবং মূল্যায়নের ক্রমটি সুস্পষ্ট (আপনার পছন্দ হোক বা না হোক)। এই "প্রতারণা" এবং প্রতিটি ক্রিয়াকলাপের সমস্ত পরামিতিগুলির জোরপূর্বক মূল্যায়নের কারণে, 1 অপরিহার্য ভাষায়) আপনি নিজের নিয়ন্ত্রণ প্রবাহ প্রক্রিয়াটি তৈরি করার ক্ষমতা হারাবেন (ম্যাক্রো ছাড়াই), ২) কোডটি সহজাতভাবে থ্রেডকে নিরাপদ এবং / অথবা সমান্তরালযোগ্য নয় গতানুগতিক, 3) এবং পূর্বাবস্থায় ফিরিয়ে আনার (সময় ভ্রমণের) মতো কিছু বাস্তবায়ন করা সতর্কতার সাথে কাজ করে (আবশ্যক প্রোগ্রামার অবশ্যই পুরানো মান (গুলি) ফেরত পাওয়ার জন্য একটি রেসিপি সংরক্ষণ করতে পারে!) যেখানে খাঁটি ফাংশনাল প্রোগ্রামিং আপনাকে এই সমস্ত জিনিস কিনে দেয় a এবং আরও কয়েকটি আমি করতে পারি "বিনামূল্যে জন্য" ভুলে গেছে।
আমি আশা করি এটি উদ্যোগীতার মতো শোনাচ্ছে না, আমি কিছুটা দৃষ্টিকোণ যুক্ত করতে চেয়েছিলাম। সি # 3.0 এর মতো শক্তিশালী ভাষায় ইমপিরিটিভ প্রোগ্রামিং এবং বিশেষত মিশ্র দৃষ্টান্তমূলক প্রোগ্রামিংগুলি জিনিসগুলি সম্পন্ন করার এখনও সম্পূর্ণ কার্যকর উপায় এবং কোনও রূপালী বুলেট নেই ।
[1] ... সম্ভবত সম্মানের মেমরির ব্যবহার ছাড়া (হাসিলে সিএফ। ভাঁজ এবং ভাঁজ ')।
কনরাদের মন্তব্যে প্রসারিত করতে:
এবং মূল্যায়নের ক্রমটি সংজ্ঞায়িত হয় না
কিছু কার্যকরী ভাষায় অলস মূল্যায়ন বলা হয়। যার অর্থ একটি ক্রিয়াকলাপটি কার্যকর না হওয়া অবধি কার্যকর করা হয় না। সেই সময় অবধি ফাংশনটি হ'ল চারপাশে যা ঘটে।
পদ্ধতিগত ভাষাগুলি হল পদক্ষেপ 1 ধাপ 2 পদক্ষেপ 3 ... যদি পদক্ষেপ 2 এ আপনি 2 + 2 যোগ করার কথা বলেন, এটি ঠিক তখনই তা করে। অলস মূল্যায়নে আপনি বলবেন 2 + 2 যোগ করুন, তবে ফলাফলটি যদি কখনও ব্যবহার না করা হয় তবে এটি কখনই সংযোজন করে না।
আপনার যদি কোনও সুযোগ থাকে তবে আমি লিস্প / স্কিমের একটি অনুলিপি পুনর্নির্মাণ করতে এবং এটিতে কিছু প্রকল্প করব। ইদানীং ব্যান্ডওয়্যাগন হয়ে উঠেছে এমন বেশিরভাগ ধারণাগুলি দশক আগে লিস্পে প্রকাশিত হয়েছিল: কার্যকরী প্রোগ্রামিং, ধারাবাহিকতা (ক্লোজার হিসাবে), আবর্জনা সংগ্রহ, এমনকি এক্সএমএল।
সুতরাং এই সমস্ত বর্তমান ধারণাগুলির উপরে মাথা চালানোর এক ভাল উপায় হবে এবং প্রতীকী গণনার মতো আরও কয়েকটি।
আপনার কী ফাংশনাল প্রোগ্রামিং ভাল এবং কোনটি ভাল নয় তা আপনার জানা উচিত। এটা সব কিছুর জন্য ভাল নয়। কিছু সমস্যা পার্শ্ব প্রতিক্রিয়াগুলির ক্ষেত্রে সবচেয়ে ভালভাবে প্রকাশ করা হয়, যেখানে একই প্রশ্ন জিজ্ঞাসা করা হয় তার উপর নির্ভর করে বিভিন্ন উত্তর দেয়।
@Creighton:
হাস্কেলে পণ্য নামে পরিচিত একটি লাইব্রেরি ফাংশন রয়েছে :
prouduct list = foldr 1 (*) list
বা সহজভাবে:
product = foldr 1 (*)
সুতরাং "আইডোমেটিক" ফ্যাটোরিয়াল
fac n = foldr 1 (*) [1..n]
সহজভাবে হবে
fac n = product [1..n]
পদ্ধতিগত প্রোগ্রামিং বিবৃতি এবং শর্তসাপেক্ষ নির্মানের ক্রমগুলি পৃথক ব্লকগুলিতে বিভক্ত করে যা প্রক্রিয়া বলে যা (অ-কার্যকরী) মানগুলির মধ্যে প্যারামিটারাইজড হয়।
ফাংশনাল প্রোগ্রামিং হ'ল ফাংশনগুলি প্রথম শ্রেণির মানগুলি ব্যতীত তাই সেগুলি অন্যান্য ফাংশনে আর্গুমেন্ট হিসাবে পাস করা যায় এবং ফাংশন কলগুলির ফলাফল হিসাবে ফিরে আসতে পারে।
নোট করুন যে কার্যকরী প্রোগ্রামিং হ'ল এই ব্যাখ্যায় পদ্ধতিগত প্রোগ্রামিংয়ের সাধারণীকরণ। তবে একটি সংখ্যালঘু "ফাংশনাল প্রোগ্রামিং" এর অর্থ পার্শ্ব-প্রভাব-মুক্ত বলতে বোঝায় যা হাস্কেল ব্যতীত সমস্ত প্রধান কার্যকরী ভাষার ক্ষেত্রে একেবারেই আলাদা তবে অপ্রাসঙ্গিক।
পার্থক্যটি বোঝার জন্য, আপনার বুঝতে হবে যে পদ্ধতিগত এবং কার্যকরী প্রোগ্রামিং উভয়ের "গডফাদার" দৃষ্টান্তটি একটি অত্যাবশ্যক প্রোগ্রামিং ।
মূলত প্রক্রিয়াগত প্রোগ্রামিং হ'ল প্রয়োজনীয় প্রোগ্রামগুলি গঠনের একমাত্র উপায় যেখানে বিমূর্তির প্রাথমিক পদ্ধতিটি "পদ্ধতি"। (বা কিছু প্রোগ্রামিং ভাষায় "ফাংশন")। এমনকি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং হ'ল একটি অত্যাবশ্যক প্রোগ্রাম গঠনের অন্য একটি উপায়, যেখানে রাজ্য বস্তুগুলিতে আবৃত হয়, "বর্তমান অবস্থা" দিয়ে একটি বস্তু হয়ে যায় এবং আরও এই বস্তুটির একটি কার্যকারিতা, পদ্ধতি এবং অন্যান্য স্টাফ রয়েছে যা আপনাকে দেয় প্রোগ্রামার রাজ্যকে কারসাজে বা আপডেট করে।
এখন, কার্যকরী প্রোগ্রামিংয়ের ক্ষেত্রে, সংক্ষেপে তার পদ্ধতির মধ্যে এটি শনাক্ত হলে কী মান নিতে এবং কিভাবে এই মান স্থানান্তরিত করা উচিত নয়। (সুতরাং কোনও রাজ্য নেই এবং কোনও পরিবর্তনীয় ডেটা যেমন এটি প্রথম শ্রেণীর মান হিসাবে ফাংশন নেয় এবং এগুলিকে অন্যান্য ফাংশনে পরামিতি হিসাবে দেয়)।
PS: প্রতিটি প্রোগ্রামিং দৃষ্টান্ত বোঝার জন্য তাদের সকলের মধ্যে পার্থক্য পরিষ্কার করা উচিত।
পিএসএস: দিনের শেষে, প্রোগ্রামিং প্যারাডিমগুলি সমস্যা সমাধানের জন্য কেবল ভিন্ন ভিন্ন পদ্ধতি।
পিএসএস: এই কোরা উত্তরের একটি দুর্দান্ত ব্যাখ্যা রয়েছে।
এখানে উত্তরগুলির মধ্যে কোনওটিই আইডেম্যাটিক ফাংশনাল প্রোগ্রামিং দেখায় না। পুনরাবৃত্তক ঘটনাবহুল উত্তর এফপিতে পুনরাবৃত্তির প্রতিনিধিত্ব করার জন্য দুর্দান্ত, তবে সংখ্যাগরিষ্ঠ কোডটি পুনরাবৃত্ত হয় না তাই আমি মনে করি না যে উত্তরটি পুরোপুরি প্রতিনিধি।
বলুন আপনার কাছে স্ট্রিংগুলির একটি অ্যারে রয়েছে এবং প্রতিটি স্ট্রিং "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
)।