ক্রিয়ামূলক প্রোগ্রামিং ভাষাগুলি কি পার্শ্ব প্রতিক্রিয়াগুলি অস্বীকার করে?


10

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

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

তবে, এছাড়াও, একটি পার্শ্ব প্রতিক্রিয়া অন্য সংজ্ঞা আছে। পার্শ্ব প্রতিক্রিয়া

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

সেই অর্থে, কার্যকরী প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি আসলে পার্শ্ব প্রতিক্রিয়াগুলিকে অনুমতি দেয়, যেহেতু তাদের বাহ্যিক জগতকে প্রভাবিত করে ফাংশনগুলির অন্যান্য উদাহরণ রয়েছে, অন্যান্য ক্রিয়াকলাপগুলি আহ্বান জানায়, ব্যতিক্রম বাড়াতে পারে, ফাইলগুলিতে লেখা ইত্যাদি of

সুতরাং, অবশেষে, ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি পার্শ্ব প্রতিক্রিয়াগুলির অনুমতি দেয় বা না?

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

উত্তর:


26

ফাংশনাল প্রোগ্রামিংয়ে বিভিন্ন কৌশল রয়েছে। কিছু কৌশল পার্শ্ব প্রতিক্রিয়া সঙ্গে সূক্ষ্ম। তবে একটি গুরুত্বপূর্ণ বিষয় সমীকরণযোগ্য যুক্তি : আমি যদি একই মানটিতে কোনও ফাংশন বলি তবে আমি সর্বদা একই ফলাফল পাই। সুতরাং আমি রিটার্ন মান সহ একটি ফাংশন কলকে বিকল্প দিতে পারি এবং সমমানের আচরণ পেতে পারি। এটি প্রোগ্রামটি সম্পর্কে তর্ক করা সহজ করে তোলে, বিশেষত ডিবাগিংয়ের সময়।

ফাংশনটির পার্শ্ব প্রতিক্রিয়া হওয়া উচিত, এটি বেশ ধারণ করে না। রিটার্ন মানটি ফাংশন কলের সমতুল্য নয়, কারণ ফেরতের মানটিতে পার্শ্ব প্রতিক্রিয়া থাকে না।

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

অপরিহার্য ভাষায়, একটি print("foo")ফাংশন কিছু মুদ্রণ করবে এবং কিছুই ফিরিয়ে দেবে না। হাস্কেলের মতো খাঁটি কার্যকরী ভাষায় কোনও printফাংশন বাইরের বিশ্বের রাষ্ট্রের প্রতিনিধিত্বকারী একটি বস্তুও নিয়ে যায় এবং এই আউটপুটটি সম্পাদন করার পরে রাষ্ট্রের প্রতিনিধিত্বকারী একটি নতুন অবজেক্ট ফিরিয়ে দেয়। কিছু মিল newState = print "foo" oldState। আমি পছন্দ মতো পুরানো রাজ্য থেকে অনেকগুলি নতুন রাষ্ট্র তৈরি করতে পারি। তবে, শুধুমাত্র একবারে মূল ফাংশনটি ব্যবহার করা হবে। সুতরাং আমি ফাংশন শৃঙ্খলাবদ্ধ করে একাধিক কর্ম থেকে রাজ্য ক্রম প্রয়োজন। মুদ্রণ করতে foo bar, আমি কিছু মত হতে পারে print "bar" (print "foo" originalState)

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

মনে রাখবেন যে হাস্কেল এই রুটটি ব্যবহার করে এমন একমাত্র ব্যবহৃত কার্যকরী ভাষা। অন্যান্য কার্যকরী ভাষা সহ। লিস্প পরিবার, এমএল পরিবার এবং স্কালার মতো নতুন কার্যকরী ভাষাগুলি নিরুৎসাহিত করে তবে তার পার্শ্ব প্রতিক্রিয়াগুলিকে অনুমতি দেয় - এগুলিকে অপরিহার্য - কার্যকরী ভাষা বলা যেতে পারে।

I / O এর পার্শ্ব প্রতিক্রিয়া ব্যবহার করা সম্ভবত ভাল। প্রায়শই I / O (লগিং ব্যতীত) কেবলমাত্র আপনার সিস্টেমের বাইরের সীমানায় করা হয়। আপনার ব্যবসায়িক যুক্তির মধ্যে কোনও বাহ্যিক যোগাযোগ ঘটে না। আপনার সফ্টওয়্যারটির মূলটি একটি খাঁটি শৈলীতে লেখা সম্ভব, যখন এখনও বাইরের শেলের মধ্যে অপরিশোধিত I / O সঞ্চালন করা হয়। এর অর্থ হ'ল মূলটি রাজ্যহীন হতে পারে।

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


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

3
@ কোডেবাট, আমার মতে বেশ নয়। যদি সঠিকভাবে প্রয়োগ করা হয় তবে ফাংশনাল প্রোগ্রামিংয়ের পার্শ্ব প্রতিক্রিয়াগুলি ফাংশনের রিটার্নের ধরণে প্রতিফলিত হওয়া উচিত। উদাহরণস্বরূপ, যদি কোনও ফাংশন ব্যর্থ হতে পারে (যদি কোনও নির্দিষ্ট ফাইল উপস্থিত না থাকে বা একটি ডেটাবেস সংযোগ স্থাপন করা যায় না), তবে ফাংশনটির রিটার্ন টাইপ ব্যর্থতা ছোঁড়ার পরিবর্তে ব্যর্থতাটিকে আবদ্ধ করতে হবে। উদাহরণের জন্য রেলওয়ে ওরিয়েন্টেড প্রোগ্রামিংটি দেখুন ( fsharpforfunandprofit.com/posts/recipe-part2 )।
হারুন এম। এশবাচ

"... এগুলিকে অপরিহার্য – কার্যকরী ভাষা বলা যেতে পারে" ": সাইমন পিটন জোন্স লিখেছিলেন" ... হাস্কেল বিশ্বের সেরা অপরিহার্য প্রোগ্রামিং ভাষা। "
জর্জিও

5

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

আমি মনে করি এটি একটি উদাহরণের সাথে পার্থক্যটি বর্ণনা করতে সহায়তা করে।

a = b + c

উপরের কোডের লাইনটি কার্যত যে কোনও ভাষায় লেখা যেতে পারে তাই আমরা কীভাবে নির্ধারণ করতে পারি যে আমরা একটি অত্যাবশ্যক বা ঘোষিত ভাষা ব্যবহার করছি কিনা? ভাষার দুই শ্রেণিতে কোডটির সেই লাইনের বৈশিষ্ট্যগুলি কীভাবে আলাদা?

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

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

আমার মন থেকে এই না পার্শ্ব প্রতিক্রিয়া বা রাজ্য, কি ভাষায় দুই ধরনের বিভিন্ন তোলে। একটি অপরিহার্য ভাষায়, কোডের কোনও নির্দিষ্ট লাইন আপনাকে প্রশ্নের মধ্যে চলকগুলির সামগ্রিক অর্থ সম্পর্কে কিছুই বলে না tells অন্য কথায়, a = b + cশুধুমাত্র এর মানে হল যে সময় একটি খুব সংক্ষিপ্ত মুহূর্তে, aএর সমষ্টি সমান ঘটেছে bএবং c

এদিকে, ঘোষণামূলক ভাষায় কোডের প্রতিটি লাইন একটি মৌলিক সত্যকে প্রতিষ্ঠিত করে যা প্রোগ্রামের পুরো জীবনকাল জুড়ে থাকবে। এই ভাষায়, a = b + cআপনি বলে যে কোন ব্যাপার কি কোডের অন্য কোন লাইন এরকম aসবসময় এর সমষ্টি সমান হবে bএবং c

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