ল্যাম্বদা কী এবং এটি কেন কার্যকর হবে? [বন্ধ]


56

এতক্ষণ আমি শুনেছি:

  • ল্যাম্বদা ক্যালকুলাস
  • লাম্বদা প্রোগ্রামিং
  • লাম্বদা এক্সপ্রেশন
  • লাম্বদা ফাংশন

যা সবগুলি ফাংশনাল প্রোগ্রামিংয়ের সাথে সম্পর্কিত বলে মনে হচ্ছে ...

স্পষ্টতই এটি সি ++ 1x এর সাথে সংহত করা হবে, তাই আমি এখন এটি আরও ভালভাবে বুঝতে পারি:

http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions

লাম্বডাস জিনিসগুলি কি সংক্ষিপ্তভাবে সংজ্ঞায়িত করতে পারে এবং এটি কার্যকর হতে পারে এমন জায়গা দিতে পারে?


2
নোট করুন যে পরিভাষাটি historতিহাসিকভাবে একটি অভিব্যক্তি দ্বারা প্রতিনিধিত্ব করা ফাংশন সম্পর্কে কথা বলার জন্য ভাল উপায় চাওয়া থেকে আসে। এক্স + 1 দ্বারা প্রতিনিধিত্ব করা ফাংশনটি পরে লাম্বদা এক্স দ্বারা লিখিত হয়। এক্স + 1 টি।
কাস্টমার

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

এটি আমার কাছে সব গ্রীক। আমার মনে হয় আমি গাইরো নিয়ে যাব, আমি মেষশাবক, দুহ পছন্দ করি।

উত্তর:


44
  • ল্যাম্বদা ক্যালকুলাস

ল্যাম্বডা ক্যালকুলাস 30 এর দশকে অ্যালোনজো চার্চ দ্বারা আবিষ্কার করা একটি গণনার মডেল। বেশিরভাগ কার্যকরী প্রোগ্রামিং ভাষার সিনট্যাক্স এবং শব্দার্থবিদ্যা ল্যাম্বডা ক্যালকুলাস দ্বারা প্রত্যক্ষ বা অপ্রত্যক্ষভাবে অনুপ্রাণিত হয়।

ল্যাম্বদা ক্যালকুলাসটি এর সবচেয়ে প্রাথমিক আকারে দুটি অপারেশন রয়েছে: অ্যাবস্ট্রাকশন (একটি অজ্ঞাতনামা) ফাংশন তৈরি করা) এবং অ্যাপ্লিকেশন (কোনও ফাংশন প্রয়োগ করুন)। ল্যাবড্ডা ক্যালকুলাসটিকে এর নাম দিয়ে Ab অপারেটর ব্যবহার করে বিমূর্তি সঞ্চালিত হয়।

  • লাম্বদা এক্সপ্রেশন
  • লাম্বদা ফাংশন

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

  • লাম্বদা প্রোগ্রামিং

এটি কোনও ব্যবহৃত ব্যবহৃত শব্দ নয়, তবে আমি ধরে নিই এর অর্থ বেনামে ফাংশন ব্যবহার করে প্রোগ্রামিং করা বা উচ্চ-ক্রম ফাংশনগুলি ব্যবহার করে প্রোগ্রামিং।


সি ++ 0 এক্স-এ ল্যাম্বডাস সম্পর্কে আরও কিছু তথ্য, তাদের অনুপ্রেরণা এবং কীভাবে তারা পয়েন্টারগুলির সাথে কাজ করে (এটি অনেকটাই সম্ভবত আপনি ইতিমধ্যে যা জানেন তার একটি পুনরাবৃত্তি, তবে আমি আশা করি এটি ল্যাম্বডাসের অনুপ্রেরণা এবং তারা কীভাবে পৃথক হয় তা ব্যাখ্যা করতে সহায়তা করে) ফাংশন পয়েন্টার থেকে):

ফাংশন পয়েন্টারগুলি, যা ইতিমধ্যে সি-তে বিদ্যমান ছিল, উদাহরণস্বরূপ একটি বাছাইকরণ ফাংশনে তুলনা ফাংশনটি পাস করতে বেশ কার্যকর। তবে তাদের দরকারীতার সীমাবদ্ধতা রয়েছে:

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

এটি সমাধানের জন্য, সি ++ "ফাংশন অবজেক্টস" বা "ফান্টেক্টর" ধারণাটি চালু করেছিলেন। ফান্টেক্টর মূলত একটি অবজেক্ট যা একটি operator()পদ্ধতি আছে। এখন আমরা একটি শ্রেণি সংজ্ঞায়িত করতে পারি CompareByIthElement, যা আর্গুমেন্টটিকে iকনস্ট্রাক্টর আর্গুমেন্ট হিসাবে গ্রহণ করে এবং তারপরে দুটি ভেক্টরকে operator()পদ্ধতির সাথে আর্গুমেন্ট হিসাবে তুলনা করতে লাগে । iতম উপাদান দ্বারা ভেক্টরগুলির একটি ভেক্টরকে বাছাই করার জন্য আমরা এখন একটি আর্গুমেন্ট হিসাবে একটি CompareByIthElementবস্তু তৈরি করতে পারি iএবং তারপরে সেই বস্তুটিকে বাছাইকরণ ফাংশনে পাস করতে পারি।

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

সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে বেশিরভাগ ফাংশন যা আর্গুমেন্ট হিসাবে ফাংশন নেয় তা টেমপ্লেটগুলি ব্যবহার করে সংজ্ঞায়িত করা হয় যাতে তারা ফাংশন পয়েন্টারগুলির পাশাপাশি ফাংশন অবজেক্টগুলির সাথে কাজ করে।

এখন ল্যাম্বডাস:

iআপনি যদি কখনও কোনও ভেক্টরকে বাছাই করার জন্য একবার ব্যবহার করতে চলেছেন তবে একটি মৌলিক উপাদানটিকে তম উপাদানটির সাথে তুলনা করতে সংজ্ঞায়িত করা কিছুটা ভার্জোজ। এমনকি যদি আপনার কেবলমাত্র একটি ফাংশন পয়েন্টার প্রয়োজন হয়, একটি নামকৃত ফাংশনটি সংজ্ঞায়িত করা উপ-অনুকূল হয় যদি এটি কেবল একবার ব্যবহার করা হয় কারণ ক) এটি নামস্থানটি দূষিত করে এবং খ) ফাংশনটি সাধারণত খুব ছোট হতে চলেছে এবং সত্যই সেখানে নেই isn't যুক্তিকে তার নিজস্ব ফাংশনে বিমূর্ত করার একটি ভাল কারণ (কোনও ফাংশন সংজ্ঞায়িত না করে আপনার ফাংশন পয়েন্টার থাকতে পারে না)।

সুতরাং এই ল্যাম্বডাস সংশোধন করার জন্য চালু করা হয়েছিল। লাম্বডাস হ'ল ফাংশন অবজেক্টস, ফাংশন পয়েন্টার নয়। আপনি যদি ল্যাম্বডা আক্ষরিক ব্যবহার [x1, x2](y1,y2){bla}করেন তবে কোডটি উত্পন্ন হয় যা মূলত নিম্নলিখিতটি করে:

  1. একটি শ্রেণী নির্ধারণ করুন যার দুটি সদস্য ভেরিয়েবল ( x1এবং x2) এবং একটি operator()আর্গুমেন্ট ( y1এবং y2) এবং বডি সহ bla
  2. শ্রেণীর একটি উদাহরণ তৈরি করুন, সদস্য ভেরিয়েবলগুলি সেট করুন x1এবং ভেরিয়েবলের x2মানগুলিতে x1এবং x2বর্তমানে সুযোগে।

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


বেনাম ফাংশন ফাংশন পয়েন্টার সঙ্গে ব্যবহার করা হয়? না হলে পার্থক্য কী?
জোকুন

1
@ জোকুন: না, বেনামে ফাংশনগুলি কেবলমাত্র ফাংশন পয়েন্টার গ্রহণকারী ফাংশনগুলিতে পরামিতি হিসাবে পাস করা যাবে না। তবে বেশিরভাগ ফাংশন যা আর্গুমেন্ট হিসাবে ফাংশন নেয় সেগুলি টেমপ্লেটগুলি ব্যবহার করে সংজ্ঞায়িত করা হয় যাতে তারা যে কোনও ধরণের ফাংশন অবজেক্টকে আর্গুমেন্ট হিসাবে গ্রহণ করতে পারে, কেবল ফাংশন পয়েন্টার হিসাবে নয়। এর অর্থ এটি বেশিরভাগ জায়গায় যেখানে আপনি ফাংশন পয়েন্টার ব্যবহার করতে পারেন ( std::sortউদাহরণস্বরূপ), আপনি পরিবর্তে বেনাম ফাংশন ব্যবহার করতে সক্ষম হবেন। তবে কোনও ফাংশন সংজ্ঞায়িত করার সময় যা কোনও অনামী ফাংশনটিকে তার আর্গুমেন্ট হিসাবে গ্রহণ করা উচিত, আপনি হয় একটি টেম্পলেট ব্যবহার করতে হবে বা std::functionআর্গুমেন্টের ধরণ হিসাবে ব্যবহার করতে হবে ।
sepp2k

সুতরাং একটি ফাংশন পয়েন্টারে একটি ল্যাম্বডা থাকতে পারে না ...
জোকুন

1
+1 দুর্দান্ত ব্যাখ্যা - আমি এটির সন্ধানও করতে পারিনি।
মাইকেল কে

2
আমি এই নিয়ে মাইকেলের সাথে আছি। এটি খুব ব্যাপক। +1আমার থেকে.
এসবিআই

18

মূলত, লাম্বদা ফাংশনগুলি হল "ফ্লাইতে" তৈরি করা ফাংশন। সি ++ 1x এ এগুলি কার্যকরী প্রোগ্রামিংয়ের জন্য এর সমর্থনটিতে উন্নতি করতে ব্যবহার করা যেতে পারে:

std::for_each( begin, end, [](int i){std::cout << i << '\n';} );

এটি মোটামুটি এইটির মতো কোডের ফলাফল করবে:

struct some_functor {
  void operator()(int i) {std::cout << i << '\n';}
};

std::for_each( begin, end, some_functor() );

আপনার যদি some_functorকেবলমাত্র এই কলটি করার প্রয়োজন হয় std::for_each(), তবে সেই ল্যাম্বদা ফাংশনটির বিভিন্ন সুবিধা রয়েছে:

  • লুপটিতে যা করা হয়েছে তা নির্দিষ্ট করা হয়েছে যেখানে লুপিং ফাংশনটি বলা হয়
  • এটি আপনাকে কিছু বয়লার-প্লেট কোড লেখা থেকে মুক্তি দেয়
  • কিছু নাম স্থানের আশেপাশে এমন কোনও ফান্ট্রার শুয়ে নেই যা কোডটির দিকে তাকিয়ে প্রত্যেককে এটির জন্য কী প্রয়োজন তা ভেবে ভাবিয়ে তোলে

7

একটি ল্যাম্বদা ফাংশন একটি বেনামি ফাংশনের অন্য নাম - মূলত নাম ব্যতীত একটি ফাংশন।

সাধারণত আপনি এটি ভাষাগুলিতে ব্যবহার করেন যেখানে আপনাকে কেবল একবার ফাংশনটি ব্যবহার করতে হবে। পরিবর্তে উদাহরণস্বরূপ

def add(a, b)
  return a+b

এবং তারপরে সেই ফাংশনটি অন্য কোনও ফাংশনে পাস করা

reduce(add, [5,3,2])

একটি ল্যাম্বদা দিয়ে আপনি সহজভাবে করতে হবে

reduce(lambda x, y: a+b, [5,3,2])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.