সংযুক্তকারীগুলি কী এবং কীভাবে তারা প্রোগ্রামিং প্রকল্পগুলিতে প্রয়োগ হয়? (ব্যবহারিক ব্যাখ্যা)


51

সংযুক্তকারী কি?

আমি খুজতেছি:

  • একটি বাস্তব ব্যাখ্যা
  • তারা কীভাবে ব্যবহৃত হয় তার উদাহরণ
  • সংযুক্তিরা কীভাবে কোডের মানের / সাধারণতা উন্নত করে তার উদাহরণ

আমি খুঁজছি না:

  • সংযুক্তকারীগুলির ব্যাখ্যা যা আমাকে কাজ করতে সহায়তা করে না (যেমন ওয়াই-কম্বিনেটর)

সংযুক্তকারীগুলি "অ্যাডওয়্যারস" এর মতো হয়, ফাংশনগুলি যে ফাংশনগুলি গ্রহণ করে তারপরে অন্যান্য ফাংশনগুলি ফিরিয়ে দেয়। তারা কোডের সদৃশতা অপসারণ করতে সহায়তা করতে পারে কারণ ভেরিয়েবলগুলির মধ্যে আপনার প্রয়োজন নেই। কিছু দরকারী দু'বার (f) = \ x -> f (f (x)), ফ্লিপ (ওপেন) -> \ xy -> y অপ x, (।) হিসাবে (fg) x = f (g (x) )), ($) মানচিত্রে (ইনফিক্সে <$> বলা হয়) হিসাবে ($ 5) <$> [(+1), (* 2)] = [,, ১০] সাহায্য করতে পারে, লিস্পে তরকারি ব্যবহার করা যেতে পারে আংশিক প্রয়োগের জন্য পাইথন / জাভাস্ক্রিপ্ট, এবং হাস্কেলের রেকর্ডগুলির প্রয়োজন (ফাংশন) জন্য অসচ্ছলতা ব্যবহার করা যেতে পারে। যখন x |> f = fa, x |> (দৈর্ঘ্য &&& যোগ) |> অস্বচ্ছল (/) গড় হয়।
aoeu256

উত্তর:


51

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

একটি (দরকারী) সংমিশ্রকের একটি সাধারণ উদাহরণ হ'ল প্যারামিটার ব্যতীত দুটি ল্যাম্বদা ফাংশন নেয় এবং একটি নতুন তৈরি করে যা তাদের ক্রম অনুসারে চালিত করে। আসল সংযোজকটি জেনেরিক সিউডোকোডে এর মতো দেখায়:

func in_sequence(first, second):
  lambda ():
    first()
    second()

এই সংমিশ্রণকারী যে গুরুত্বপূর্ণ জিনিসটি হ'ল দ্বিতীয় লাইনের বেনামে ফাংশন (ল্যাম্বডা ফাংশন); আপনি কল যখন

a = in_sequence(f, g)

ফলস্বরূপ বস্তু ক প্রথম চ () এবং তারপরে জি () চালানোর ফলাফল নয় , তবে এটি এমন একটি বস্তু যা আপনি পরে ক্রমিকভাবে f () এবং g () চালানোর জন্য কল করতে পারেন:

a() // a is a callable object, i.e. a function without parameters

আপনার অনুরূপভাবে তখন একটি সংযুক্তকারী থাকতে পারে যা সমান্তরালে দুটি কোড ব্লক চালায়:

func in_parallel(first, second):
  lambda ():
    t1 = start_thread(first)
    t2 = start_thread(second)
    wait(t1)
    wait(t2)

এবং তারপর আবার,

a = in_parallel(f, g)
a()

দুর্দান্ত জিনিসটি হ'ল 'ইন_প্যারালাল' এবং 'ইন_ সিকোয়েন্স' উভয়ই একই ধরণের / স্বাক্ষরের সমন্বয়কারী, অর্থাৎ তারা উভয় দুটি প্যারামিটারলেস ফাংশন অবজেক্ট নেয় এবং একটি নতুন ফিরিয়ে দেয়। আপনি আসলে মত জিনিস লিখতে পারেন

a = in_sequence(in_parallel(f, g), in_parallel(h, i))

এবং এটি প্রত্যাশার মতো কাজ করে।

মূলত সুতরাং সংযুক্তকারীরা আপনাকে আপনার প্রোগ্রামের নিয়ন্ত্রণ প্রবাহকে (অন্যান্য জিনিসের মধ্যে) একটি পদ্ধতিগত এবং নমনীয় ফ্যাশনে তৈরি করার অনুমতি দেয়। উদাহরণস্বরূপ, আপনি যদি আপনার প্রোগ্রামে সমান্তরালতা চালানোর জন্য ইন_প্যারালাল (..) সংযুক্তকারী ব্যবহার করেন তবে আপনি ইন-প্যারালাল সংযুক্তকারী নিজেই প্রয়োগের সাথে সম্পর্কিত ডিবাগিং যুক্ত করতে পারেন। পরবর্তীতে, যদি আপনি সন্দেহ করেন যে আপনার প্রোগ্রামের সমান্তরালতা সম্পর্কিত বাগ রয়েছে, তবে আপনি প্রকৃতপক্ষে কেবল ইন-প্যারালাল রিম্প্লেমেন্ট করতে পারেন:

in_parallel(first, second):
  in_sequence(first, second)

এবং একটি স্ট্রোকের সাথে, সমস্ত সমান্তরাল বিভাগগুলি অনুক্রমিক বিভাগে রূপান্তরিত হয়েছে!

সংযুক্তকারীগুলি সঠিকভাবে ব্যবহৃত হলে খুব দরকারী।

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


9

ওয়াই-কম্বিনেটরকে এমন কিছু হিসাবে ব্র্যান্ড করা ভুল যে "কাজ শেষ করতে সহায়তা করবে না"। আমি এটি বেশ কয়েকটি অনুষ্ঠানে খুব দরকারী বলে মনে করেছি। সর্বাধিক সুস্পষ্ট কেসটি হ'ল যখন আপনাকে কিছু এম্বেডড ব্যাখ্যিত ভাষা দ্রুত বুটস্ট্র্যাপ করতে হয়। আপনি প্রিমিটিভের একটি সংক্ষিপ্ত সেট প্রদান তাহলে, যথা sequence, select, call, constএবং closure allocation, এটি একটি সম্পূর্ণ, নির্বিচারে জটিল ভাষা উপরের নির্মাণের জন্য ইতিমধ্যে যথেষ্ট। পুনরাবৃত্তির জন্য কোনও বিশেষ সহায়তার প্রয়োজন নেই - এটি একটি নির্দিষ্ট পয়েন্ট সংযোজকের মাধ্যমে যুক্ত করা যেতে পারে। অন্যথায় আপনার আরও জটিল আদিম প্রয়োজন হবে।

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

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

এটি একটি রসিকতা , তবে খুব যত্ন সহকারে পড়ার মতো একটি কৌতুক, যেহেতু অনেকগুলি আরকেন প্রোগ্রামিং কৌশল এবং তত্ত্বগুলি সেখানে আচ্ছাদিত।


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

@ ম্যাটফেনউইক, আপনার প্রশ্নের হিসাবে: আপনি এপিএল বা জেতে কিছু কোড লেখার চেষ্টা করতে পারেন b কম্বিনেটরগুলি সেখানে প্রয়োজনীয়, এছাড়াও, বিন্দু মুক্ত শৈলীতে পড়তে সহায়তা করতে পারে: en.wikedia.org/wiki/Tacit_programming
এসকে-যুক্তি

7

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

সমন্নয়ের লজিক উইকিপিডিয়ার পৃষ্ঠা আরো বিশ্বব্যাপী combinators বর্ণনা করা হয়েছে।


এটি আমার প্রশ্নের দ্বিতীয় বুলেট পয়েন্ট সম্বোধন করে। উদাহরণের জন্য ধন্যবাদ!

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