কেন 'জিপ' সংগ্রহের ঝাঁকুনি লেজ উপেক্ষা করে?


12

সি # , স্কালা, হাস্কেল, লিস্প এবং পাইথনের একই zipআচরণ রয়েছে: যদি একটি সংগ্রহ দীর্ঘ হয় তবে লেজটি চুপচাপ উপেক্ষা করা হয়।

এটি পাশাপাশি ছুঁড়ে দেওয়া ব্যতিক্রম হতে পারে, তবে আমি এই পদ্ধতির ব্যবহার করে কোনও ভাষা শুনিনি।

এই ধাঁধা আমার। zipসেভাবে ডিজাইন করার কারণটি কি কেউ জানেন ? আমার ধারণা নতুন ভাষার জন্য, এটি করা হয়েছে কারণ অন্যান্য ভাষাগুলি এভাবে করে। তবে এর মূল কারণ কী ছিল?

আমি এখানে বাস্তববাদী, -তিহাসিক ভিত্তিক প্রশ্ন জিজ্ঞাসা করছি, কারও পছন্দ না হলে বা এটি ভাল বা খারাপ পদ্ধতির জন্য নয়।

আপডেট : যদি আমাকে জিজ্ঞাসা করা হয় যে আমি কী করব, আমি বলব - একটি ব্যতিক্রম ছুঁড়ে মারুন ঠিক একইভাবে একটি অ্যারে সূচিকরণের জন্য ("পুরানো" ভাষা সত্ত্বেও কীভাবে সীমানা সূচক, ইউবি, অ্যারে প্রসারিত হ'ল, সমস্ত ধরণের যাদু করেছিল) ইত্যাদি)।


10
এটি যদি কোনও ফান্টারের লেজটিকে উপেক্ষা না করে তবে অসীম অনুক্রমগুলি ব্যবহার করা আরও জটিল umbers বিশেষত যদি অসীম সীমার দৈর্ঘ্য পাওয়া ব্যয়বহুল / সংশ্লেষিত / অসম্ভব ছিল।
17-29-2009

2
আপনি মনে করেন যে এটি অপ্রত্যাশিত এবং অদ্ভুত। আমি এটি স্পষ্ট এবং সত্যই, অনিবার্য বলে মনে করি। কি হবে আপনি ঘটতে যখন আপনি অসম দৈর্ঘ্য সংগ্রহ zip চাও?
কিলিয়ান ফট

@ কিলিয়ানফথ, একটি ব্যতিক্রম নিক্ষেপ করুন
গ্রিনোল্ডম্যান

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

1
পাইথনের itertools.izip_longest রয়েছে, যা কার্যকরভাবে অটোপ্যাডস ননের সাথে ইনপুট সমাপ্ত করে। আমি যখন প্রায়শই জিপ ব্যবহার করি তখন আমি প্রায়শই জিপের উপরে এটি চয়ন করি; আমি যদিও আর কোনও পছন্দের পিছনে কারণগুলি মনে করতে পারি না। পাইথনের ইতিমধ্যে @ গ্রীনল্ডম্যানের ক্ষেত্রে গণনা করা () রয়েছে, যা আমি প্রায়শই ব্যবহার করি।
স্টারওয়েভার

উত্তর:


11

এটি প্রায়শই আপনি যা চান তা হ'ল, এবং যখন তা না হয় আপনি নিজে পূরণ করতে পারেন।

মূল সমস্যাটি অলস শব্দার্থবিজ্ঞানের সাথে আপনি প্রথম শুরু করার সময় দৈর্ঘ্যটি জানেন না zip, তাই আপনি শুরুতে কেবল একটি ব্যতিক্রম ছোঁড়াতে পারবেন না। আপনাকে প্রথমে সমস্ত সাধারণ উপাদানগুলি ফেরত দিতে হবে, তারপরে একটি ব্যতিক্রম ছুঁড়ে ফেলুন, যা খুব কার্যকর হবে না।

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


আমি historicতিহাসিক কারণ সম্পর্কে জিজ্ঞাসা করছি, আমি কী করতে পারি তা নয়। দ্বিতীয় অনুচ্ছেদ - আপনি ভুল, zipবর্তমানে কীভাবে প্রয়োগ করা হয় তা একবার দেখুন । ব্যতিক্রম ছুঁড়ে ফেলা সহজভাবে "স্টপ ফলন" কে "নিক্ষেপ" এ পরিবর্তন করা হচ্ছে। তৃতীয় অনুচ্ছেদ - সীমানা ছাড়িয়ে যাওয়ার জন্য খালি উপাদানটি ফিরে আসা ব্যর্থ হতে পারে না, তবে আমি সন্দেহ করি যে কোনও এফপি দেব ভোট দেবে এটি একটি ভাল নকশা।
গ্রিনোল্ডম্যান

3
আমার দ্বিতীয় অনুচ্ছেদটি সমস্ত বাস্তবায়নের ক্ষেত্রে প্রযোজ্য নয়, কেবল সত্যই অলস। যদি আপনি zipদু'টি অসীম ক্রম একসাথে করেন তবে শুরুতে আপনি আকারটি জানেন না। তৃতীয় অনুচ্ছেদে আমি বললাম যুক্তিসঙ্গত ডিফল্ট। এক্ষেত্রে খালি ফিরে যাওয়া যুক্তিসঙ্গত হবে না, যদিও লেজটি বাদ দেওয়া স্পষ্টতই।
কার্ল বিলেফেল্ট

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

3
+1 এটি একটি দুর্দান্ত উত্তর, "কার্যকরী প্রোগ্রামাররা এমন কন্সট্রাক্টগুলিকে পছন্দ করেন যা ডিজাইনে ব্যর্থ হতে পারে না" এটি স্পষ্টতই বলে দেয় যে সংখ্যাগরিষ্ঠ ডিজাইনের সিদ্ধান্তের পিছনে বৃহত্তম প্রেরণা কি কার্যকরী প্রোগ্রামাররা করেন make ইমপিরিটিভ প্রোগ্রামারদের একটি নিয়ম রয়েছে যা তাদের বলা হয়েছে "বলুন, জিজ্ঞাসা করবেন না", এফপি পরম শেষ মুহুর্ত পর্যন্ত ফলাফল পরীক্ষা করার প্রয়োজন ছাড়াই নির্দেশাবলী অবিরত বলার অনুমতি দেওয়ার উপর মনোনিবেশ করে এটিকে নবম ডিগ্রিতে নিয়ে যায়, তাই আমরা মধ্যবর্তী পদক্ষেপগুলি নিশ্চিত করার চেষ্টা করি ব্যর্থ হতে পারে না , কারণ সামঞ্জস্যতা রাজা king খুব ভাল বলেছেন.
জিমি হোফা

12

কারণ লেজ সম্পূর্ণ করার কোনও সুস্পষ্ট উপায় নেই। কীভাবে এটি করবেন তার যে কোনও পছন্দের ফলে একটি অ-সুস্পষ্ট লেজ তৈরি হবে।

কৌশলটি হ'ল আপনার প্রত্যাশিত মানগুলির সাথে দীর্ঘতম দৈর্ঘ্যের দৈর্ঘ্যের সাথে মেলে আপনার স্বল্পতম তালিকাটি সুস্পষ্টভাবে দীর্ঘতর করুন।

জিপ যদি এটি আপনার জন্য করে থাকে তবে আপনি জানতে পারবেন না যে এটি স্বজ্ঞাতভাবে কোন মান পূরণ করে। এটি তালিকা চক্র ছিল? এটি কি একটি স্বচ্ছ মানটির পুনরাবৃত্তি করেছিল? আপনার ধরণের জন্য একটি ম্যাম্পি মান কী?

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


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

যদিও এই এবং অন্যান্য অনেক সাধারণ এফপি স্টাইলের ফাংশনগুলি সাধারণ কারণ মনে রাখবেন, কারণ এটি সাধারণ এবং সাধারণীকরণযোগ্য তাই আপনি তাদের কোডটি ব্যবহার করতে এবং আপনার পছন্দসই আচরণটি পেতে আপনার কোডটি টুইঙ্ক করতে পারেন। উদাহরণস্বরূপ, সি # তে আপনি কেবল পারেন

IEnumerable<Tuple<T, U>> ZipDefaults(IEnumerable<T> first, IEnumerable<U> second)
{
    return first.Count() < second.Count()
        ? first.Concat(Enumerable.Repeat(default(T), second.Count() - first.Count())).Zip(second)
        : first.Zip(second.Concat(Enumerable.Repeat(default(U), first.Count() - second.count())))
}

বা অন্যান্য সহজ জিনিস। এফপি পদ্ধতির পরিবর্তনগুলি এত সহজ করে তোলে কারণ আপনি টুকরোগুলি পুনরায় ব্যবহার করতে পারবেন এবং প্রয়োগগুলি এতটা ছোট হতে পারে যে আপনার নিজস্ব পরিবর্তিত সংস্করণগুলি তৈরি করা অত্যন্ত সহজ।


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

2
zipনাল পূরণ করতে পারে, যা প্রায়শই একটি স্বজ্ঞাত সমাধান। প্রকারটি বিবেচনা করুন zip :: [a] -> [b] -> [(Maybe a, Maybe b)]। মঞ্জুর, ফলাফলের ধরনটি কিছুটা ^ এইচ ^ এইচটি বেশ অযৌক্তিক, তবে এটির উপরে অন্য কোনও আচরণ (শর্ট কাট, ব্যতিক্রম) সহজেই প্রয়োগ করতে দেয়।
আমন

1
@ এমন: এটি মোটেই স্বজ্ঞাত নয়, এটি নির্বোধ। এর জন্য প্রতিটি যুক্তি শূন্য করা দরকার।
ডেডএমজি

4
@ প্রতি মুহুর্তে প্রত্যেক ধরণের শূন্যতা নেই, যা আমি বোঝাতে চেয়েছি mempty, বস্তুগুলি স্থান পূরণ করতে নালাগুলি রয়েছে , তবে আপনি কী চান যে এটি আন্ত এবং অন্যান্য ধরণের জন্যও এই জাতীয় জিনিস নিয়ে আসা উচিত? নিশ্চিত, সি # হয়েছে default(T)কিন্তু সমস্ত ভাষা না, এবং এমনকি C # এর যে সত্যিই সুস্পষ্ট আচরণ? আমার মনে হয় না
জিমি হোফা

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