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


43

বলুন আমাদের মতো একটি সাধারণ খাঁটি ফাংশন রয়েছে

function add(a, b) {
  return a + b
}

এবং তারপরে আমরা এটিকে এমনভাবে পরিবর্তন করি যে এর পার্শ্ব প্রতিক্রিয়া রয়েছে

function add(a, b) {
  writeToDatabase(Math.random())
  return a + b;
}

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

এই ধরণের ক্রিয়াকলাপের জন্য আলাদা নাম আছে কি এটি নামবিহীন, না এটি এখনও বিশুদ্ধ এবং পবিত্রতার সংজ্ঞা সম্পর্কে আমি ভুল করছি?


91
"খাঁটি ফাংশন নয়"।
রস প্যাটারসন

2
@ রসপ্যাটারসন এটাই আমি ভেবেছিলাম, তবে জিজ্ঞাসা করে আমি রেফারেন্সিয়াল স্বচ্ছতা সম্পর্কে শিখেছি তাই আমি আনন্দিত যে আমি এটি নিজের কাছে রাখিনি।
এম0meni

9
যদি writeToDatabaseব্যর্থ হয় এটি একটি ব্যতিক্রম ট্রিগার করতে পারে যাতে আপনার দ্বিতীয় addক্রিয়াকলাপটি কখনও কখনও ব্যতিক্রম ঘটায় একই যুক্তি দিয়ে বলা হয় যে এর আগে সমস্যা ছিল না ... বেশিরভাগ সময় পার্শ্ব প্রতিক্রিয়া থাকলে এই ধরণের ত্রুটি-সম্পর্কিত অবস্থার সাথে পরিচয় হয় "ইনপুট-আউটপুট বিশুদ্ধতা"।
বাকুরিউ

25
কিছু যে সবসময় একটি প্রদত্ত ইনপুট জন্য একই আউটপুট দিতে বলা হয় নির্ণায়ক
njzk2

2
@ njzk2: TRUE, কিন্তু এটি এর আড়ম্বরহীন । একটি স্টেটফুল ডিটারমিনিস্টিক ফাংশন প্রতিটি ইনপুটের জন্য একই আউটপুট দিতে পারে না। উদাহরণ: এটি পূর্ববর্তী কল হিসাবে একই যুক্তি দিয়ে বলা F(x)হয় ফিরে আসতে সংজ্ঞায়িত করা হয় true। স্পষ্টতই ক্রমটির সাথে এটি {1,2,2} => {undefined, false, true}ডিটারমিনিস্টিক, তবুও এটি বিভিন্ন আউটপুট দেয় F(2)
এমসাল্টাররা

উত্তর:


85

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

এই সংজ্ঞা অনুসারে, একটি খাঁটি ফাংশন একটি ফাংশন যা:

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

এই সংজ্ঞা দিয়ে এটি স্পষ্ট হয়েছে যে আপনার দ্বিতীয় ক্রিয়াকলাপটি খাঁটি হিসাবে বিবেচনা করা যাবে না, কারণ এটি 2 নিয়ম ভাঙে That অর্থাৎ, নিম্নলিখিত দুটি প্রোগ্রাম সমতুল্য নয়:

function f(a, b) { 
    return add(a, b) + add(a, b);
}

এবং

function g(a, b) {
    c = add(a, b);
    return c + c;
}

এটি কারণ উভয় ফাংশন একই মান ফেরত দেবে, ফাংশন fদুটিবার ডাটাবেসে gলিখবে তবে একবার লিখবে! এটি খুব সম্ভবত যে ডেটাবেসকে লেখা আপনার প্রোগ্রামের পর্যবেক্ষণযোগ্য আচরণের অংশ, এই ক্ষেত্রে আমি আপনার দ্বিতীয় সংস্করণটি add"খাঁটি" নয় বলে দেখিয়েছি ।

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


1
"কেবলমাত্র তার ইনপুট উপর নির্ভর করে" নিরর্থক প্রদত্ত রেফারেন্সিয়াল স্বচ্ছতা দেওয়া হয় না? কোনটি বোঝায় যে আরটি বিশুদ্ধতার সমার্থক? (আমি যে উত্সগুলি সন্ধান করি সে সম্পর্কে আমি আরও বিভ্রান্ত হয়ে যাচ্ছি)
Ixrec

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

কুঁজসদৃশ। আমাদের বলুন যে আমাদের এমন ফাংশন রয়েছে যা পার্শ্ব প্রতিক্রিয়া ব্যতীত খাঁটি এবং আপনার দুটি নমুনা সমতুল্য এমন আচরণ করার গ্যারান্টিযুক্ত। (আমি আসলে এই ঘটনাটি সামনে এনেছি তাই এটি অনুমানকৃত নয়)) আমি মনে করি আমরা বেশ সম্পন্ন করেছি না।
জোশুয়া

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

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

19

আপনি কোন ফাংশনটিকে কী ডাকেন [যার জন্য] একই ইনপুট সর্বদা একই আউটপুট ফেরত দেবে, তবে এর পার্শ্ব প্রতিক্রিয়াও রয়েছে?

যেমন একটি ফাংশন বলা হয়

নির্ণায়ক

একটি অ্যালগরিদম যার আচরণের সম্পূর্ণ ইনপুট থেকে পূর্বাভাস দেওয়া যেতে পারে।

termwiki.com

রাষ্ট্র সম্পর্কিত:

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

আপনার ফাংশন উভয়ই হতাশাবোধমূলক। আপনার প্রথমটিও একটি খাঁটি ফাংশন। আপনার দ্বিতীয় খাঁটি নয়।

খাঁটি ফাংশন

  1. ফাংশন সর্বদা একই আর্গুমেন্ট মান (গুলি) প্রদত্ত একই ফলাফলের মানটি মূল্যায়ন করে। ফাংশন ফলাফলের মান কোনও গোপন তথ্য বা অবস্থার উপর নির্ভর করতে পারে না যা প্রোগ্রামের নির্বাহের সময় বা প্রোগ্রামের বিভিন্ন নির্বাহের মধ্যে পরিবর্তিত হতে পারে বা এটি I / O ডিভাইসগুলির কোনও বাহ্যিক ইনপুটের উপর নির্ভর করতে পারে না।

  2. ফলাফলের মূল্যায়ন কোনও শব্দার্থগতভাবে পর্যবেক্ষণযোগ্য পার্শ্ব প্রতিক্রিয়া বা আউটপুট সৃষ্টি করে না, যেমন পরিবর্তনযোগ্য বস্তুর রূপান্তর বা I / O ডিভাইসে আউটপুট।

wikipedia.org

পয়েন্ট 1 এর অর্থ হ'ল ডিটারমিনিস্টিক । পয়েন্ট 2 এর অর্থ রেফারেন্সিয়াল স্বচ্ছতা । একসাথে তাদের অর্থ একটি খাঁটি ফাংশন কেবল তার তর্কগুলি এবং তার প্রত্যাবর্তিত মানকে পরিবর্তনের অনুমতি দেয়। অন্য কিছুই পরিবর্তনের কারণ নয়। আর কিছুই বদলায় না।


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

@ ফ্র্যাক্স সিস্টেম মেমরি অনুপলব্ধ হতে পারে। সিপিইউ অনুপলব্ধ হতে পারে। নির্বিচারবাদী হওয়া সাফল্যের গ্যারান্টি দেয় না। এটি গ্যারান্টি দেয় যে সফল আচরণ অনুমানযোগ্য।
candied_orange

OOMing কোনও ফাংশনের সাথে সুনির্দিষ্ট নয়, এটি বিভিন্ন ধরণের সমস্যার is এখন, আসুন আপনার "খাঁটি ফাংশন" সংজ্ঞাটির 1 পয়েন্টটি দেখুন (যা প্রকৃতপক্ষে "ডিটারিস্টিনিস্টিক" অর্থ): "ফাংশন ফলাফলের মান কোনও গোপন তথ্য বা রাষ্ট্রের উপর নির্ভর করতে পারে না যা প্রোগ্রাম কার্যকর করার সময় বা বিভিন্ন মৃত্যুদন্ড কার্যকর করার সময় পরিবর্তিত হতে পারে change প্রোগ্রামটি , না এটি I / O ডিভাইসগুলির কোনও বাহ্যিক ইনপুটের উপর নির্ভর করতে পারে "। ডেটাবেস সেই ধরণের রাজ্য, সুতরাং ওপস ফাংশন স্পষ্টভাবে এই শর্তটি পূরণ করে না - এটি নির্বিচারক নয়।
ফ্রেक्स

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

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

9

আপনি যদি পার্শ্ব প্রতিক্রিয়া সম্পর্কে চিন্তা না করেন, তবে এটি স্বচ্ছভাবে স্বচ্ছ। অবশ্যই এটি সম্ভব যে আপনি যত্ন নিচ্ছেন না তবে অন্য কেউ করেন, সুতরাং শব্দটির প্রয়োগযোগ্যতা প্রসঙ্গ নির্ভর।

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

সুতরাং, যদি আপনার পার্শ্ব-প্রতিক্রিয়াটি একটি নির্দিষ্ট সারিতে একটি নির্দিষ্ট মান সহ একটি ডাটাবেস আপডেট করতে বা ঠিক সামঞ্জস্যপূর্ণ বিষয়বস্তু সহ একটি ফাইল তৈরি করা হয়, তবে এটি আদর্শবান হবে, তবে এটি যদি ডাটাবেসে যুক্ত হয় বা কোনও ফাইলের সাথে সংযুক্ত থাকে তাহলে তা হবে না।

আদর্শবানী কার্যগুলির সংমিশ্রণগুলি সামগ্রিকভাবে আদর্শবান হতে পারে বা নাও পারে।

* গণিতের তুলনায় কম্পিউটার বিজ্ঞানে আইডেম্পোটেন্টের ব্যবহার আলাদাভাবে দেখা যায় যে ধারণাটি কার্যকর হওয়ায় গণিতের যে শব্দটি গ্রহণ করা হয়েছিল তার ভুল ব্যবহার থেকে এসেছে from


3
"রেফারেন্টালি স্বচ্ছ" শব্দটি "কেউ যত্নশীল" কিনা তার চেয়ে বেশি কঠোরভাবে সংজ্ঞায়িত হয়। এমনকি যদি আমরা আইও সম্পর্কিত বিষয় যেমন সংযোগ সমস্যাগুলি, অনুপস্থিত সংযোগের স্ট্রিংগুলি, টাইমআউটগুলি ইত্যাদিকে উপেক্ষা করি, তবে এটি এখনও দেখানো সহজ যে একটি প্রোগ্রাম যা প্রতিস্থাপন (f x, f x)করে let y = f x in (y, y)তা ডিস্কের স্পেস-ব্যতিক্রমগুলির দ্বিগুণ দ্রুত চলে যাবে আপনি তর্ক করতে পারেন যে এগুলি প্রান্তের ক্ষেত্রে আপনি যত্ন নেবেন না, তবে এ জাতীয় অস্পষ্ট সংজ্ঞা সহ আমরা new Random().Next()উল্লেখযোগ্যভাবে স্বচ্ছ বলতে পারি কারণ হেক, যাইহোক আমি কী নম্বর পাব তা আমি খেয়াল করি না।
সারা

@ কাই: প্রসঙ্গের উপর নির্ভর করে আপনি পার্শ্ব-প্রতিক্রিয়া উপেক্ষা করতে পারেন। অন্যদিকে, এলোমেলো মত কোনও ফাংশনের রিটার্ন মান কোনও পার্শ্ব প্রতিক্রিয়া নয়: এটি এর প্রধান প্রভাব।
জর্জিও

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

3

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


1
একমত! এটি (অনানুষ্ঠানিকভাবে) "ফাংশন" এর গাণিতিক সংজ্ঞা, তবে আপনি যেমন বলে থাকেন দুর্ভাগ্যক্রমে "ফাংশন" এর অর্থ প্রোগ্রামিং ভাষাগুলিতে কিছু আলাদা, যেখানে এটি "মান অর্জনের জন্য প্রয়োজনীয় একটি ধাপে ধাপে" ধীরে ধীরে কাছে আসে।
আন্দ্রেস এফ

2

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

বা অন্য কোনও উপায়ে বলতে গেলে, যতক্ষণ না খাঁটি ভিত্তিতে অপ্টিমাইজেশন প্রোগ্রামের শব্দার্থকে ভাঙবে না এটি ঠিক আছে।

আরও বাস্তবসম্মত উদাহরণ হ'ল যদি আপনি এই ফাংশনটি ডিবাগ করার চেষ্টা করে এবং লগিংয়ের বিবৃতি যুক্ত করেন। প্রযুক্তিগতভাবে, লগিং একটি পার্শ্ব প্রতিক্রিয়া। লগগুলি কি তা অপরিষ্কার করে? না।


ঠিক আছে, এটা নির্ভর করে। হতে পারে লগগুলি এটিকে অপরিষ্কার করে তোলে, উদাহরণস্বরূপ যদি আপনি কতবার এবং কোন সময়ে "INFO f () নামক" আপনার লগে প্রদর্শিত হয় সে সম্পর্কে যত্নশীল হন। যা আপনি প্রায়শই করেন :)
Andres F.

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

@AndresF। ঠিক আছে, আপনি সম্ভবত আক্ষরিক সংখ্যা প্রায় যত্ন নিতে পারেন না। আপনি সম্ভবত কেবল খেয়াল রাখবেন যে এটি ফাংশনটি বলা হয়েছিল যতবার ডাকা হয়েছে।
ডেড এমজি

@ বাসিলিভস ফাংশনের আচরণ তাদের উপর মোটেই নির্ভর করে না। যদি লগ লিখন ব্যর্থ হয় তবে আপনি ঠিক চালিয়ে যান।
ডেড এমজি

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

1

আমি বলব যে সবচেয়ে ভাল জিজ্ঞাসা করার বিষয়টি হ'ল আমরা এটিকে কীভাবে ডাকব তা নয়, তবে আমরা কীভাবে কোডটির এই অংশটি বিশ্লেষণ করব । এবং এই জাতীয় বিশ্লেষণে আমার প্রথম মূল প্রশ্নটি হ'ল:

  • পার্শ্ব প্রতিক্রিয়া কি কার্যকারিতা যুক্তির উপর নির্ভর করে, বা পার্শ্ব প্রতিক্রিয়াটির ফলাফল?
    • না: "কার্যকর কার্যকারিতা" একটি বিশুদ্ধ ফাংশন, একটি কার্যকর ক্রিয়া এবং তাদের সংমিশ্রনের জন্য একটি ব্যবস্থায় পুনঃসংশ্লিষ্ট করা যেতে পারে।
    • হ্যাঁ: "কার্যকরী ফাংশন" এমন একটি ফাংশন যা মোনাদিক ফলাফল তৈরি করে।

এটি হাস্কেল চিত্রিত করার জন্য সোজা (এবং এই বাক্যটি কেবল অর্ধেক রসিকতা)। "না" মামলার উদাহরণ এরকম কিছু হতে পারে:

double :: Num a => a -> IO a
double x = do
  putStrLn "I'm doubling some number"
  return (x*2)

এই উদাহরণে আমরা যে পদক্ষেপ নিই (লাইনটি প্রিন্ট করব "I'm doubling some number") তার xফলাফল এবং ফলাফলের মধ্যে কোনও প্রভাব ফেলবে না । এর অর্থ আমরা এটিকে এটিকে ( Applicativeক্লাস এবং এটির *>অপারেটর ব্যবহার করে ) রিফ্যাক্টর করতে পারি , যা দেখায় যে ফাংশন এবং প্রভাবটি আসলে অর্থেগোনাল:

double :: Num a => a -> IO a
double x = action *> pure (function x)
  where
    -- The pure function 
    function x = x*2  
    -- The side effect
    action = putStrLn "I'm doubling some number"

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

"হ্যাঁ" সাজানোর উদাহরণ, যেখানে খাঁটি এবং কার্যকর অংশগুলি অর্থোগোনাল নয়:

double :: Num a => a -> IO a
double x = do
  putStrLn ("I'm doubling the number " ++ show x)
  return (x*2)

এখন, আপনি যে স্ট্রিংটি মুদ্রণ করছেন তার মানের উপর নির্ভর করে xফাংশন অংশ (সংখ্যাবৃদ্ধি x২) তবে, এ সব প্রভাব উপর নির্ভর করে না তাই আমরা এখনও এটি খুঁজে বিবেচনার করতে পারেন:

logged :: (a -> b) -> (a -> IO x) -> IO b
logged function logger a = do
  logger a
  return (function a)

double x = logged function logger
  where function = (*2) 
        logger x putStrLn ("I'm doubling the number " ++ show x)

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

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


-2

কার্যাবলী যে কারণ পার্শ্ব প্রতিক্রিয়া উদ্দেশ্যে করা হয় প্রায়ই বলা হয় effectful । উদাহরণ https://slpopejoy.github.io/posts/Effectful01.html


বিস্তৃত স্বীকৃত শব্দটি কার্যকর হিসাবে উল্লেখ করার জন্য কেবল উত্তর এবং এটি ভোট গ্রহণের সাথে সাথেই নেমে আসে .... অজ্ঞতা সুখী আমি মনে করি। ..
বেন হাচিসন

"প্রভাবশালী" এমন একটি শব্দ যা পোস্টটির লেখক "পার্শ্ব-প্রতিক্রিয়া হওয়া" বোঝার জন্য সহমত বেছে নিয়েছিলেন। সে তাই বলে।
রবার্ট হার্ভে

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

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