যদি কোনও ফাংশন প্যারামিটার হিসাবে কোনও ফাংশন নেয় তবে তা অবিলম্বে অশুদ্ধ?


17

যেহেতু কোনও ইনপুট প্যারামিটারের বিশুদ্ধতা রানটাইম অবধি অজানা, তাই কোনও ফাংশনটি যদি তা ইনপুট প্যারামিটার হিসাবে কোনও ফাংশন নেয় তবে তা অবিলম্বে অপবিত্র হিসাবে বিবেচিত হবে?

সম্পর্কিত: যদি কোনও ফাংশন কোনও শুদ্ধ ফাংশন প্রয়োগ করে যা ফাংশনের বাইরে সংজ্ঞায়িত করা হয়, তবে এটি প্যারামিটার হিসাবে পাস করা হয় না, তবে কি এখনও যদি এটি কোনও পার্শ্ব প্রতিক্রিয়া এবং আউটপুট না থাকার মানদণ্ডকে সম্পূর্ণভাবে ইনপুট উপর নির্ভর করে তবে তা খাঁটি?

প্রসঙ্গে, আমি জাভাস্ক্রিপ্টে ফাংশনাল কোড লিখছি।


একটি তুচ্ছ কাউন্টার উদাহরণ হিসাবে বিবেচনা করুন:foo = function(function bar){ print(bar.toString()) }
ডেভিড

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

3
@ ডেভিডগ্রিনবার্গ তবে, আমি মনে করি আপনি একটি ভাল দিক নিয়ে ভাবছেন। foo = function(function bar) { return 3; } হয় বিশুদ্ধ, এবং একটি আর্গুমেন্ট হিসাবে একটি ফাংশন লাগে।
জোশুয়া টেলর

@ জোশুয়া টেলর ফেয়ার পয়েন্ট, আমি এটি ভেবে দেখিনি। তবে আপনি ইতিমধ্যে সমস্যার সমাধান করেছেন। বিকল্প ফিক্স হিসাবে, কেবল 'রুট' toString()(যাকে আপনি জাভার অবজেক্টে খুঁজে পাবেন) কল করুন।
ডেভিড মনিকাকে

উত্তর:


22

যতক্ষণ না ফাংশনে ব্যবহৃত সমস্ত মানগুলি কেবলমাত্র তার পরামিতিগুলির দ্বারা সংজ্ঞায়িত করা হয় ততক্ষণ এটি খাঁটি ফাংশন।

আউটপুট প্রতিটি সময় একই ইনপুট জন্য একই হয় পরামিতিগুলি খাঁটি কিনা তা দ্বারা নিয়ন্ত্রিত হয়। আপনি যদি ধরে নেন যে প্যারামিটারগুলি (কোনও ফাংশন আর্গুমেন্টের মতো )ও খাঁটি হয় তবে তা খাঁটি।

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

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

অনুশীলনে আমার অভিজ্ঞতায় এটি সাধারণত কোনও বড় বিষয় নয় - খাঁটি ফাংশনগুলির ফাংশন আর্গুমেন্ট হিসাবে অশুচি ফাংশন ব্যবহার করা আমার কাছে বিরল বলে মনে হয়।


আপনার বক্তব্য সম্পর্কে যে "যতক্ষণ পর্যন্ত ফাংশনে ব্যবহৃত সমস্ত মানগুলি কেবল তার পরামিতি দ্বারা সংজ্ঞায়িত করা হয় ততক্ষণ এটি খাঁটি ফাংশন"। ধ্রুবকের ক্ষেত্রে কী ঘটে? যদি আমি একটি ফাংশন আছে areaOfCircle r => Math.Pi * r * r, হবে areaOfCircleঅ বিশুদ্ধ এটা শুধু পরামিতি ব্যবহার করে না হিসেবে?
ডেভিড আরনো

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

1
"এর অর্থ এই যে খাঁটি ফাংশনটির অশুচি আচরণ করা সম্ভব" - সংজ্ঞা অনুসারে, একটি খাঁটি ফাংশনে অশুচি আচরণ থাকতে পারে না। আপনি এমন কোনও ফাংশন ভাবার ভুল করছেন f(f2)যা আহ্বান f2করে যা কোনও কিছুতে f2নির্ভর করে যা অস্থায়ীভাবে নির্ভর করে না । একটি ফাংশন যা স্বেচ্ছাসেবী পাস-ইন ফাংশন প্রার্থনা করতে পারে তা শুদ্ধ নয়।
ইউজার 2357112 19-29

2
@ ডেইনথ: আরও ভাল, তবে এটি এখনও ধরে নিয়েছে যে ফাংশনটি পাস-ইন ফাংশনটি আহ্বান করতে হবে। এটি এমন কিছু হতে পারে function compose(f, g) {return function h(x) {return f(g(x));};}যা যুক্তি হিসাবে ফাংশন গ্রহণের পরেও খাঁটি।
ব্যবহারকারী 2357112 23:15

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

19

যেহেতু কোনও ইনপুট প্যারামিটারের বিশুদ্ধতা রানটাইম অবধি অজানা, তাই কোনও ফাংশনটি যদি তা ইনপুট প্যারামিটার হিসাবে কোনও ফাংশন নেয় তবে তা অবিলম্বে অপবিত্র হিসাবে বিবেচিত হবে?

নং প্রতিবিম্ব:

function pure(other_function) {
    return 1;
}

এটা কোন ব্যাপার না কিনা other_functionএকটি বিশুদ্ধ ফাংশন, একটি অশুদ্ধ ফাংশন, বা সব সময়ে একটি ফাংশন। pureফাংশন বিশুদ্ধ হয়।

অন্যান্য প্রতিবিম্ব:

function identity(x) {
    return x;
}

এই ফাংশনটি শুদ্ধ, এমনকি যদি xএকটি অপরিষ্কার ফাংশন। identity(impure_function)আপনি impure_functionযতবার কলটি পুনরাবৃত্তি করেন তা সর্বদা ফিরে আসবে । identity(impure_function)()সর্বদা একই জিনিস ফিরিয়ে দেয় কিনা তা বিবেচ্য নয়; কোনও ফাংশনের রিটার্ন ভ্যালুর ফেরতের মান তার বিশুদ্ধতার উপর প্রভাব ফেলবে না।


সাধারণভাবে, যদি কোনও ফাংশন কোনও ফাংশন কল করতে পারে তবে এটি আর্গুমেন্ট হিসাবে পাস করা হয়েছিল, এটি খাঁটি নয়। উদাহরণস্বরূপ, কোনও ফাংশন function call(f) {f();}বিশুদ্ধ নয়, যদিও এটি কোনও বিশ্বব্যাপী বা পরিবর্তনীয় অবস্থার কোনও উল্লেখ না করে, fএমন কিছু হতে পারে যা alertদৃশ্যমান পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে।

যদি কোনও ফাংশন আর্গুমেন্ট হিসাবে ফাংশন নেয়, তবে এটি তাদের কল করে না বা তাদের ডেকে আনে না, তবে তা খাঁটি হতে পারে। এটি অন্য কিছু অপরিষ্কার কাজ করে তা এখনও অপরিষ্কার হতে পারে। উদাহরণস্বরূপ, function f(ignored_function) {alert('This isn't pure.');}অশুচি, যদিও এটি কখনও কল করে না ignored_function


4
এই প্রতিক্রিয়া অত্যধিক পেডেন্টিক বলে মনে হচ্ছে। আমরা এই প্রশ্নটি থেকে অনুমান করতে পারি যে উদ্বেগটি ফাংশনটির প্যারামিটারটি চাওয়া হচ্ছে over ফাংশনগুলির অস্তিত্ব যা সেগুলি না চাওয়া ছাড়া প্যারামিটার হিসাবে অন্যান্য ফাংশনগুলি নিতে পারে / করতে পারে এই প্রশ্নটিকে প্রভাবিত করে না।
ওলপেপ

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

12

যেহেতু কোনও ইনপুট প্যারামিটারের বিশুদ্ধতা রানটাইম অবধি অজানা, তাই কোনও ফাংশনটি যদি তা ইনপুট প্যারামিটার হিসাবে কোনও ফাংশন নেয় তবে তা অবিলম্বে অপবিত্র হিসাবে বিবেচিত হবে?

প্রযুক্তিগতভাবে, হ্যাঁ, যদি না আপনার ভাষাটিতে গ্যারান্টি দেওয়ার কোনও উপায় না থাকে যে ইনপুট ফাংশনটিও খাঁটি।

যদি কোনও ফাংশন কোনও শুদ্ধ ফাংশন প্রয়োগ করে যা ফাংশনের বাইরে সংজ্ঞায়িত করা হয়, তবে এটি প্যারামিটার হিসাবে পাস করা হয় না, তবে কি এখনও যদি এটি কোনও পার্শ্ব প্রতিক্রিয়া এবং আউটপুট না থাকার মানদণ্ডটি সম্পূর্ণভাবে ইনপুট উপর নির্ভর করে তবে তা খাঁটি?

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

ফাংশনটি তার কাজটি করার জন্য অন্যান্য খাঁটি পঠনযোগ্য ফাংশনগুলি ব্যবহার করে যদি তা সেগুলি কীভাবে রেফারেন্স করে তা বিবেচনা না করে এখনও সেই দরকারী বৈশিষ্ট্যগুলি ধারণ করে।


5

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

এটি কাল্পনিক নয়, এটির নিশ্চয়তা দেওয়ার ভাল উপায় রয়েছে। কমপক্ষে দৃ strongly়ভাবে টাইপ করা ভাষায়।

যেমন একটি খাঁটি ~ ফাংশন আপনি জাভাস্ক্রিপ্ট হিসাবে লিখতে চাই

function foo(f) {
   return f(1) + 2;
}

সরাসরি হাস্কেল অনুবাদ করা যেতে পারে:

foo :: (Int -> Int) -> Int
foo f = f 1 + 2

এখন, জাভাস্ক্রিপ্টে আপনি মন্দ জিনিসগুলি করতে পারেন

js> foo (function(x) {console.log("muharhar"); return 0})
muharhar
2

হাস্কেলে এটি সম্ভব নয় । কারণ হওয়ার কারণ, কিছু সাইড-এফেক্ট-ফুলের মতো console.log()সর্বদা ফলাফলের ধরণ থাকতে হবে IO something, কেবল somethingএকা নয়।

GHCi> foo (\x -> print "muarhar" >> return 0)

<interactive>:7:12:
    Couldn't match expected type ‘Int’ with actual type ‘IO b0’
    In the expression: print "muarhar" >> return 0
    In the first argument of ‘foo’, namely
      ‘(\ x -> print "muarhar" >> return 0)’
    In the expression: foo (\ x -> print "muarhar" >> return 0)

এই ভাবটি টাইপচেক করার জন্য fooআমাদের প্রকারের স্বাক্ষর দেওয়া দরকার

foo :: (Int -> IO Int) -> Int

তবে দেখা যাচ্ছে যে আমি আর এটি প্রয়োগ করতে পারি না: কারণ যুক্তি ফাংশনটির IOফলস্বরূপ, আমি এটি এর মধ্যে ব্যবহার করতে পারি না foo

<interactive>:8:44:
    Couldn't match expected type ‘Int’ with actual type ‘IO Int’
    In the first argument of ‘(+)’, namely ‘f 1’
    In the expression: f 1 + 2

আমি যদি কোন IOক্রিয়াটি ব্যবহার করতে পারি fooতবে ফলাফলটি নিজেই fooটাইপ করলে IO Int:

foo :: (Int -> IO Int) -> IO Int
foo f = do
   f1 <- f 1
   return (f1 + 2)

তবে এই মুহুর্তে এটি স্বাক্ষর থেকে পরিষ্কার fooযে এটি কোনও খাঁটি ফাংশন নয়।


1
আপনি "অসম্ভব" বলার আগে একবার দেখুন unsafeIO:-)
বার্গি

2
@ বার্গি: এটি আসলে হাস্কেলের অংশ নয়, তবে এর বৈদেশিক ফাংশন ইন্টারফেসের: অন্য কোন ভাষায় সংজ্ঞায়িত একটি ফাংশন বিশুদ্ধ, তা নিশ্চিত করার অনুমতি দেওয়ার জন্য, হ্যাস্কেল সংকলক স্পষ্টতই স্বাক্ষর টাইপ থেকে অনুগ্রহ করতে পারে না কারণ অন্যান্য ভাষায় সাধারণত কোন ভাষা নেই যেমন জিনিস IO। ঘটনাক্রমে, এটি একটি "খাঁটি" ফাংশনে পার্শ্ব-প্রতিক্রিয়াগুলি গোপন করে বিস্ময়ের কারণ হতে পারে, তবে এটি হাস্কেলের ক্ষেত্রে সত্যই অনিরাপদ কারণ খাঁটি ফাংশনগুলির মূল্যায়ন আদেশ নির্দিষ্ট করার জন্য কোনও নির্ভরযোগ্য উপায় নেই।
7:30 এ বাম দিকের বাইরে

হাঁ সত্য যে. তবে আমি মনে করি যে এটি একটি "খাঁটি" ফাংশনেও উপকারী পার্শ্ব প্রতিক্রিয়াগুলি "লুকানোর" জন্য ব্যবহৃত হয়েছে , যেখানে পদ্ধতির নিরাপত্তা আগে প্রতিষ্ঠিত করতে হয়েছিল established
বার্গি

@ বার্গি আপনার বেশিরভাগ ব্যবহার করা উচিত নয় unsafeIO; এটি একটি সর্বশেষ-অবলম্বন পালানোর হ্যাচ যা টাইপ সিস্টেমের গ্যারান্টিটিকে পাশ কাটে এবং তাই আপনার কোনও ভাল বিষয় নয়।
আন্দ্রেস এফ।

0

না এটা না.

যদি পাস ফাংশনটি অশুচি হয় এবং আপনার ফাংশনটি পাস ফাংশনটিকে কল করে তবে আপনার ফাংশনটি অশুচি বলে বিবেচিত হবে।

খাঁটি / অপরিষ্কার সম্পর্কটি জেএসে কিছুটা সিঙ্ক / অ্যাসিঙ্কের মতো। আপনি অশুচি থেকে নিখরচায় বিশুদ্ধ কোড ব্যবহার করতে পারেন, তবে অন্যভাবে নয়।


এই উত্তরটি এমন কোনও কিছু যুক্ত করে না যা ইতিমধ্যে এর একটিতে ব্যাখ্যা করা হয়নি ... দয়া করে জিনিসগুলি বিশ্রাম দেওয়ার আগে পূর্বের উত্তরগুলি পর্যালোচনা করুন :)
Andres F.

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