ফার্স্ট ক্লাস ফাংশন এবং হাই অর্ডার ফাংশনের মধ্যে কোনও পার্থক্য


129

আমি প্রথম শ্রেণির ফাংশন এবং হাই অর্ডার ফাংশনের মধ্যে / কি পার্থক্য তা ভাবছি ।

আমি সেই দুটি উইকি পৃষ্ঠাগুলি পড়েছি এবং সেগুলি দেখতে একইরকম দেখাচ্ছে। যদি তারা একই কথা বলছে তবে কেন দুটি পরিভাষার দরকার?

গুগলে চেষ্টা করেছি কিন্তু কোনও কার্যকর জিনিস খুঁজে পেল না।

উত্তর:


154

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

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

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


2
আমি মনে করি যে একটি জিনিস আমাকে সহজেই বিভ্রান্ত করে তোলে তা হ'ল তারা নিবিড়ভাবে সম্পর্কিত।
সাইমন

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

ঠিক বেন। আমি ভাবছিলাম যে এই দুজনই উভয়ই ফাংশনের সম্পত্তি তাই আমি বিভ্রান্ত হয়ে পড়েছিলাম। আপনার মন্তব্য ধন্যবাদ।
সাইমন

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

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

67

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

উচ্চতর ক্রিয়াকলাপগুলি এমন ফাংশন যা কমপক্ষে একটি প্রথম শ্রেণীর ফাংশন প্যারামিটার হিসাবে গ্রহণ করে বা কমপক্ষে একটি প্রথম শ্রেণির ফাংশন দেয়।


20

তারা আলাদা।

প্রথম শ্রেণির কাজ

কোনও ভাষার মূল্যবোধগুলি যেগুলি জুড়ে অভিন্নভাবে পরিচালিত হয় তাকে "প্রথম শ্রেণি" বলা হয়। এগুলি ডেটা স্ট্রাকচারে সংরক্ষণ করা হতে পারে, আর্গুমেন্ট হিসাবে পাস করা হয়েছে বা নিয়ন্ত্রণ কাঠামোগুলিতে ব্যবহৃত হতে পারে।

যে ভাষাগুলি ফাংশনের ধরণের সাথে মানগুলিকে সমর্থন করে এবং তাদেরকে অ-ফাংশন মানগুলির মতো একই আচরণ করে, তাদের "প্রথম শ্রেণির ফাংশন" বলা যেতে পারে।

উচ্চতর ক্রিয়াকলাপ

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

ক্যানোনিকাল উদাহরণ "মানচিত্র"

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

অর্থাৎ এটি একটি ফাংশন এবং একটি অ্যারে নেয় এবং প্রতিটি উপাদানগুলিতে প্রয়োগ করা ফাংশন সহ একটি নতুন অ্যারে প্রদান করে।

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


1
ধন্যবাদ ডন এটি ব্যাপক। এবং আমি মনে করি ফেজ "পরিণতিগুলির মধ্যে একটি" এই দুজনের মধ্যে এক ধরণের সম্পর্ককে নির্দেশ করে।
সাইমন

10

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

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

সুতরাং প্রথম শ্রেণির ফাংশনগুলির উপস্থিতি (ভাষার বৈশিষ্ট্য হিসাবে) উচ্চ-ক্রমের ক্রিয়াকলাপগুলির উপস্থিতি বোঝায়, তবে অন্যভাবে নয়।


আপনি কি দয়া করে একটি উদাহরণ দিতে পারেন যেখানে উচ্চতর ক্রমটি প্রথম শ্রেণীর ফাংশন নয়। (আমি ভেবেছিলাম উভয়ই সমান))
এথার

@ এথার, আমার কাছে এমন কোনও ভাষার কোনও দৃ concrete় উদাহরণ নেই যা এই জাতীয় ফাংশনগুলির জন্য এমন নকশার পছন্দ করতে পারে। তবে এর মতোই কিছু ঘটনা যেমন সি ++ তে টেমপ্লেটগুলি রয়েছে: টেমপ্লেটগুলি উচ্চ-ক্রমযুক্ত (আপনার "টেমপ্লেট টেম্পলেট প্যারামিটারগুলি থাকতে পারে") তবে প্রথম শ্রেণীর মান নয়, অর্থাৎ টেমপ্লেটগুলি সাধারণ ক্রিয়াকলাপগুলির পরামিতি হতে পারে না। এম.এল. যেমন মডিউল / ফান্টেক্টর সহ একইভাবে।
Andreas রসবার্গ

@ আন্দ্রেস রসসবার্গ কি জাভা 8 তার প্রশ্নের বৈধ উত্তর হবে না? ফাংশনগুলি প্রথম শ্রেণির নাগরিক নয়, তবে জাভা পদ্ধতিগুলি ফাংশনগুলি (ফাংশনাল ইন্টারফেসের মাধ্যমে) গ্রহণ করতে পারে, যেমনটি আপনার দ্বারা বর্ণিত হিসাবে "ফাংশনগুলি হ'ল প্যারামিটারগুলি বিশেষভাবে বিবেচিত হয় এবং" সাধারণ "মান পরামিতি থেকে পৃথক হয়"
আব্দুল

1

প্রথম শ্রেণির ফাংশনগুলি:

  • ভেরিয়েবলের মধ্যে সংরক্ষণ করা
  • একটি ফাংশন থেকে ফিরে আসা।
  • অন্য কোনও কার্যক্রমে যুক্তি হিসাবে পাস করুন।

হাই অর্ডার ফাংশন এমন একটি ফাংশন যা অন্য ফাংশনকে ফিরিয়ে দেয়।

উদাহরণ স্বরূপ:

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}

0

প্রথম শ্রেণীর ফাংশন বলতে বোঝায় যে আপনি অন্যান্য ধরণের (ভেরিয়েবল, বুলিয়ানস, সংখ্যা ...) দিয়ে যা করতে পারেন তা আপনি ফাংশন দিয়ে করতে পারেন।

উদাহরণস্বরূপ এগুলি ভেরিয়েবলগুলিতে বরাদ্দ করুন, এটিকে চারপাশে পাস করুন, এগুলি ফ্লাইতে তৈরি করুন।

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