রেফারেন্সিয়াল স্বচ্ছতা কী?


38

আমি দেখেছি যে অপরিহার্য দৃষ্টান্তগুলিতে

চ (x) এর + F (x) এর

এর মতো হতে পারে না:

2 * চ (x) এর

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

এমন কোনও উদাহরণ কী হবে যা প্রদত্ত ফাংশনটির সাথে পার্থক্যটি নির্দেশ করতে পারে?


7
অজগরটিতে আপনি রেফারেন্টালি স্বচ্ছ ফাংশন লিখতে এবং প্রায়শই করতে পারেন। পার্থক্যটি হল ভাষা এটি প্রয়োগ করে না।
কার্ল বিলেফেল্ট

5
সি এবং একইভাবে মধ্যে: f(x++)+f(x++)হিসাবে একই নাও হতে পারে 2*f(x++)(? সি এটি বিশেষ সুদৃশ্য যখন যে ম্যাক্রো মধ্যে লুকানো হয় ভালো জিনিস নেই - আমি যে আমার নাক ভেঙে করেনি আপনি বাজি)
মশা

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

4
@ এসএসডেকট্রোল: আসলে, যখন আপনার রেফারেন্সিয়াল স্বচ্ছতা থাকে, পাস-বাই-ভ্যালু এবং পাস-বাই-রেফারেন্স সর্বদা সঠিক ফলাফল দেয়, তাই ভাষা কোনটি ব্যবহার করে তা বিবেচ্য নয়। শব্দসম্পর্কিত স্পষ্টতার জন্য কার্যকরী ভাষাগুলি হ'ল পাস-বাই-মান সমান কিছু দিয়ে নির্দিষ্ট করা হয় তবে তাদের প্রয়োগগুলি প্রায়শই পারফরম্যান্সের জন্য পাস-বাই-রেফারেন্স ব্যবহার করে (অথবা উভয়ই, প্রদত্ত প্রসঙ্গে যেটি দ্রুত হয় তার উপর নির্ভর করে)।
Jörg ডব্লু মিট্টাগ

4
@ গ্যাनेट: বিশেষত, f(x++)+f(x++)একেবারে যে কোনও কিছু হতে পারে, যেহেতু এটি অনির্ধারিত আচরণকে নির্দেশ করে। তবে এটি প্রকৃতপক্ষে রেফারেনশিয়াল স্বচ্ছতার সাথে সম্পর্কিত নয় - যা এই আহ্বানের জন্য সহায়ক হবে না, এটি যেমন রেফারেন্সালি ট্রান্সফারেন্সের জন্যও 'অপরিজ্ঞাত' sin(x++)+sin(x++)। ৪২ বছর হতে পারে, আপনার হার্ডড্রাইভকে ফর্ম্যাট করতে পারে, ব্যবহারকারীর নাক থেকে
শয়তানরা

উত্তর:


62

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

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

counter = 0

def foo(x):
  global counter

  counter += 1
  return x + counter

প্রকৃতপক্ষে কলিং উল্লেখযোগ্যভাবে স্বচ্ছ নয়

foo(x) + foo(x)

এবং

2 * foo(x)

যে কোনও যুক্তির জন্য বিভিন্ন মান তৈরি করে x। এর কারণ হ'ল ফাংশনটি একটি বৈশ্বিক পরিবর্তনশীল ব্যবহার করে এবং সংশোধন করে, সুতরাং প্রতিটি অনুরোধের ফলাফল এই পরিবর্তিত রাষ্ট্রের উপর নির্ভর করে, কেবলমাত্র ফাংশনের যুক্তিতে নয়।

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

সুতরাং, যে কোনও হাস্কেল ফাংশনের জন্য

f :: Int -> Int

এবং কোনও পূর্ণসংখ্যা x, এটি সর্বদা সত্য

2 * (f x) == (f x) + (f x)

ক্রিয়াকলাপের উদাহরণ লাইব্রেরি ফাংশনের ফলাফল getLine:

getLine :: IO String

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

[getLine, getLine] :: [IO String]

ক্রিয়াগুলি বিশেষ যা আপনি হাস্কেল রানটাইমকে লিখে দিয়ে তাদের সম্পাদন করতে বলতে পারেন:

main = <some action>

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

হাস্কেলের টাইপ সিস্টেমকে ধন্যবাদ, একটি ক্রিয়া কখনই এমন প্রসঙ্গে ব্যবহার করা যাবে না যেখানে অন্য ধরণের প্রত্যাশিত হয় এবং বিপরীতে। সুতরাং, আপনি যদি কোনও স্ট্রিংয়ের দৈর্ঘ্য সন্ধান করতে চান তবে আপনি lengthফাংশনটি ব্যবহার করতে পারেন :

length "Hello"

ফিরে আসবে ৫. তবে আপনি যদি টার্মিনাল থেকে পড়া স্ট্রিংয়ের দৈর্ঘ্য সন্ধান করতে চান তবে আপনি লিখতে পারবেন না

length (getLine)

কারণ আপনি একটি টাইপ ত্রুটি পান: lengthটাইপ তালিকার একটি ইনপুট প্রত্যাশা করে (এবং একটি স্ট্রিং প্রকৃতপক্ষে একটি তালিকা) তবে getLineএটি টাইপের মান IO String(একটি ক্রিয়া)। এই পদ্ধতিতে, টাইপ সিস্টেমটি নিশ্চিত করে যে কোনও ক্রিয়াকলাপের getLine(যেমন কার্যকর ভাষা মূল ভাষার বাইরে পরিচালিত হয় এবং যা রেফারেন্টালি স্বচ্ছ হতে পারে) প্রকারের অ-অ্যাকশন মানের মধ্যে লুকানো যায় না Int

সম্পাদনা

এক্সিজ্ট প্রশ্নের উত্তর দেওয়ার জন্য, এখানে একটি ছোট হাসকল প্রোগ্রাম রয়েছে যা কনসোল থেকে একটি লাইন পড়ে এবং তার দৈর্ঘ্য মুদ্রণ করে।

main :: IO () -- The main program is an action of type IO ()
main = do
          line <- getLine
          putStrLn (show (length line))

প্রধান ক্রিয়ায় দুটি সাবজেক্ট থাকে যা ক্রমান্বয়ে সম্পাদিত হয়:

  1. getlineধরণের IO String,
  2. দ্বিতীয়টি তার যুক্তি putStrLnঅনুসারে টাইপ ফাংশন মূল্যায়ন করে নির্মিত হয় String -> IO ()

আরও স্পষ্টভাবে, দ্বিতীয় ক্রিয়াটি বিল্ট built

  1. lineপ্রথম ক্রিয়নের দ্বারা পড়া মানকে আবদ্ধ করা,
  2. খাঁটি ফাংশনগুলি length(পূর্ণসংখ্যা হিসাবে গণনা দৈর্ঘ্য) মূল্যায়ন এবং তারপরে show(পূর্ণসংখ্যাকে একটি স্ট্রিংয়ে পরিণত করুন),
  3. putStrLnএর ফলাফলের সাথে ফাংশন প্রয়োগ করে ক্রিয়া তৈরি করা show

এই মুহুর্তে, দ্বিতীয় ক্রিয়াটি কার্যকর করা যেতে পারে। আপনি যদি "হ্যালো" টাইপ করেন তবে এটি "5" মুদ্রণ করবে।

দ্রষ্টব্য যে আপনি যদি <-স্বরলিপিটি ব্যবহার করে কোনও ক্রিয়াকলাপের মধ্যে একটি মান পেয়ে থাকেন তবে আপনি কেবলমাত্র অন্য মানটির মধ্যে সেই মানটি ব্যবহার করতে পারেন, যেমন আপনি লিখতে পারবেন না:

main = do
          line <- getLine
          show (length line) -- Error:
                             -- Expected type: IO ()
                             --   Actual type: String

কারণ show (length line)টাইপ রয়েছে Stringযেখানে নোটেশনটির প্রয়োজন হয় যে কোনও ক্রিয়া ( getLineটাইপ IO String) এর পরে অন্য ক্রিয়া অনুসরণ করা উচিত (যেমন putStrLn (show (length line)): টাইপ IO ())।

সম্পাদনা 2

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


10
ডাউনওয়োটার কী পরামর্শ দিতে পারে যে আমি এই উত্তরটি কীভাবে উন্নত করতে পারি?
জর্জিও

সুতরাং কীভাবে একজন হাস্কেলের টার্মিনাল থেকে পংক্তির দৈর্ঘ্য পাবে?
এসবিচেনকো

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

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

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

25
def f(x): return x()

from random import random
f(random) + f(random) == 2*f(random)
# => False

যাইহোক, যে না কি উল্লেখ ট্রান্সপারেন্সি উপায়। আরটি মানে আপনি প্রোগ্রামটির কোনও অর্থ পরিবর্তন না করেই সেই অভিব্যক্তিটি (বা তদ্বিপরীত) মূল্যায়নের ফলাফলের সাথে প্রোগ্রামের কোনও অভিব্যক্তি প্রতিস্থাপন করতে পারেন ।

উদাহরণস্বরূপ, নিম্নলিখিত প্রোগ্রামটি ধরুন:

def f(): return 2

print(f() + f())
print(2)

এই প্রোগ্রামটি উল্লেখযোগ্যভাবে স্বচ্ছ। আমি এর f()সাথে এক বা উভয় উপস্থিতি প্রতিস্থাপন করতে পারি 2এবং এটি এখনও একই কাজ করবে:

def f(): return 2

print(2 + f())
print(2)

অথবা

def f(): return 2

print(f() + 2)
print(2)

অথবা

def f(): return 2

print(2 + 2)
print(f())

সব একই আচরণ করবে।

আসলে, আমি প্রতারণা করেছি। printপ্রোগ্রামটির অর্থ পরিবর্তন না করে আমার কলটি তার রিটার্ন মান (যা কোনও মূল্য নয়) দিয়ে প্রতিস্থাপন করতে সক্ষম হওয়া উচিত । তবে, স্পষ্টতই, আমি যদি কেবল দুটি printবিবৃতি সরিয়ে ফেলি তবে প্রোগ্রামটির অর্থ বদলে যাবে: আগে, এটি স্ক্রিনে কিছু মুদ্রিত করে, এটির পরে না। I / O উল্লেখযোগ্যভাবে স্বচ্ছ নয়।

থাম্বের সহজ নিয়মটি হ'ল: যদি আপনি প্রোগ্রামটির অর্থ পরিবর্তন না করে কোনও অভিব্যক্তি, উপ-এক্সপ্রেশন বা সাব্রোটিন কলটিকে প্রোগ্রামের যে কোনও জায়গায়, সাব-এক্সপ্রেশন বা সাবরুটিন কলকে প্রতিস্থাপন করতে পারেন, তবে আপনার রেফারেন্সিয়াল থাকতে হবে স্বচ্ছতা. এবং এর অর্থ, ব্যবহারিকভাবে বলতে গেলে এটি হ'ল আপনার কোনও আই / ও থাকতে পারে না, কোনও পরিবর্তনীয় অবস্থা থাকতে পারে না, কোনও পার্শ্ব-প্রতিক্রিয়াও থাকতে পারে না। প্রতিটি অভিব্যক্তিতে, অভিব্যক্তিটির মানটি কেবলমাত্র প্রকাশের উপাদানগুলির অংশগুলির উপর নির্ভর করে। এবং প্রতিটি সাব্রোটিন কলটিতে, ফেরতের মানটি কেবলমাত্র যুক্তিগুলির উপর নির্ভর করে।


4
"কোনও পরিবর্তনীয় অবস্থা থাকতে পারে না": আচ্ছা, এটি যদি লুকানো থাকে এবং আপনার কোডের পর্যবেক্ষণযোগ্য আচরণকে প্রভাবিত না করে তবে আপনি এটি রাখতে পারেন। স্মৃতিচারণ সম্পর্কে উদাঃ চিন্তা করুন।
জর্জিও

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

1
+1 আমি printউদাহরণটি পছন্দ করি । এটি দেখার একটি উপায় সম্ভবত পর্দায় যা মুদ্রিত তা হ'ল "রিটার্ন মান" এর একটি অংশ। যদি আপনি printএর ফাংশন রিটার্ন মান এবং টার্মিনালে সমমানের লেখার সাথে প্রতিস্থাপন করতে পারেন তবে উদাহরণটি কাজ করে।
পিয়ের আরলাড

1
রেফারেন্সিয়াল স্বচ্ছতার উদ্দেশ্যে @ জর্জিও স্পেস / সময়ের ব্যবহারকে পার্শ্ব প্রতিক্রিয়া হিসাবে বিবেচনা করা যায় না। যে করতে হবে 4এবং 2 + 2অ বিনিমেয় যেহেতু তারা বিভিন্ন চলমান বার আছে, এবং উল্লেখ স্বচ্ছতার পুরো পয়েন্ট যে আপনি একটি অভিব্যক্তি যাই হোক না কেন সঙ্গে এটি মূল্যায়ণ প্রতিস্থাপন করতে পারেন। গুরুত্বপূর্ণ বিবেচনাটি থ্রেড নিরাপত্তা হবে।
ডোভাল

1
@ সার্বভৌম এক্সচেঞ্জ: রেফারেনশিয়াল ট্রান্সপারেন্সি মানে আপনি প্রোগ্রামটির অর্থ পরিবর্তন না করে প্রতিটি সাপ এক্সপ্রেশনকে এর মান দিয়ে প্রতিস্থাপন করতে পারেন। listOfSequence.append(n)ফিরে আসে None, যাতে আপনার প্রোগ্রামটির অর্থ পরিবর্তন না করে আপনার listOfSequence.append(n)সাথে প্রতিটি কল প্রতিস্থাপন করতে সক্ষম হওয়া উচিত None। আপনি এটা করতে পারেন? যদি তা না হয় তবে এটি স্বচ্ছ নয়।
জার্গ ডব্লু মিট্টাগ

1

এই উত্তরের অংশগুলি সরাসরি আমার গিটহাব অ্যাকাউন্টে হোস্ট করা ফাংশনাল প্রোগ্রামিংয়ের একটি অসম্পূর্ণ টিউটোরিয়াল থেকে নেওয়া হয়েছে :

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

একটি সাধারণ উদাহরণ বিবেচনা করুন:

x = 42

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

হাস্কেল উইকি থেকে :

খালি গণনা প্রতিবার যখন অনুরোধ করা হয় তখন একই মান দেয়। এই সম্পত্তিটিকে রেফারেনশিয়াল স্বচ্ছতা বলা হয় এবং কোডটিতে সমীকরণের যুক্তি পরিচালনা করা সম্ভব করে তোলে ...

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

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

  • এটি কোনও পার্শ্ব প্রতিক্রিয়া প্রদর্শন করার অনুমতি নেই, এবং
  • এটি অবশ্যই স্বচ্ছ হতে হবে।

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

সংক্ষেপে বলা যায়, প্রোগ্রামিং ভাষার শব্দার্থক শব্দগুলির শব্দার্থক ক্ষেত্রেও সত্য , গাণিতিক ক্রিয়াকলাপগুলির মতো আচরণ করার জন্য প্রাসঙ্গিক স্বচ্ছতা আবশ্যক ।


এটি এখান থেকে নেওয়া শব্দ-প্রতিলিপি অনুলিপিটির সাথে খোলার মতো মনে হয় : "কোনও ফাংশনটি উল্লেখযোগ্যভাবে স্বচ্ছ বলে মনে করা হয় যদি এটি একই ইনপুট পরামিতিগুলি দিয়ে সর্বদা একই আউটপুট সরবরাহ করে ..." স্ট্যাক এক্সচেঞ্জের চৌর্যবৃত্তির নিয়ম রয়েছে , আপনি এই সম্পর্কে সচেতন? "চৌর্যবৃত্তি অন্যের কাজের অংশগুলি অনুলিপি করা, এটির উপর আপনার নাম চাপড়ানো এবং নিজেকে মূল লেখক হিসাবে সরিয়ে দেওয়ার
gnat

3
আমি পৃষ্ঠাটি লিখেছি।
Yesthisuser

যদি এটি হয় তবে এটিকে চৌর্যবৃত্তির চেয়ে কম দেখানোর বিষয়টি বিবেচনা করুন - কারণ পাঠকদের বলার কোনও উপায় নেই। এসই এ কীভাবে করবেন তা আপনি জানেন? 1) আপনি মূল উত্সটি উল্লেখ করুন, যেমন "আমি (যেমন লিখেছি) [here](link to source)..." এর পরে 2) যথাযথ উদ্ধৃতি বিন্যাস (উদ্ধৃতি চিহ্নগুলি ব্যবহার করুন, বা আরও ভাল, এর > জন্য প্রতীক)। সাধারণ দিকনির্দেশনা দেওয়ার পাশাপাশি, উত্তর সম্পর্কিত প্রশ্নাবলীর বিষয়ে জিজ্ঞাসা করা প্রশ্নগুলি, f(x)+f(x)/ সম্পর্কে এই ক্ষেত্রে 2*f(x), উত্তর কীভাবে দেখুন দেখুন তাও ক্ষতিগ্রস্থ হবে না - অন্যথায় মনে হতে পারে আপনি কেবল নিজের পৃষ্ঠাটি বিজ্ঞাপন করছেন
gnat

1
তাত্ত্বিকভাবে, আমি এই উত্তরটি বুঝতে পেরেছি। তবে, কার্যত এই নিয়মগুলি অনুসরণ করে, আমাকে এই প্রোগ্রামে শিলাবৃত্তির ক্রম তালিকাটি ফিরিয়ে আনতে হবে । আমি এটা কিভাবে করবো?
15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.