প্রোগ্রামিং ভাষায় নীচের ধরণের কোনও কারণ আছে কি?


49

একটি নীচের প্রকারটি মূলত গাণিতিক টাইপ তত্ত্বে প্রদর্শিত একটি নির্মাণ ruct একে খালি টাইপও বলা হয়। এটি এমন এক ধরণের যার কোনও মান নেই তবে এটি সমস্ত ধরণের একটি উপপ্রকার।

যদি কোনও ফাংশনের রিটার্ন টাইপ নীচের প্রকার হয় তবে এর অর্থ এটি ফিরে আসে না। সময়কাল। হতে পারে এটি চিরকালের জন্য লুপ হয়ে যায়, অথবা এটি ব্যতিক্রম ছুঁড়ে দেয়।

প্রোগ্রামিং ভাষায় এই অদ্ভুত টাইপের কী লাভ? এটি সাধারণ নয়, তবে এটি স্কেলা এবং লিস্পের মতো কিছুতে উপস্থিত রয়েছে।


2
@ সার্জবার্স: আপনি কি নিশ্চিত? অবশ্যই সি তে কেউ কোনও voidডেটা স্পষ্টভাবে সংজ্ঞায়িত করতে পারে না ...
বেসিল স্টারিনকিভিচ

3
@ বেসাইলস্টারিঙ্কেভিচ টাইপের কোনও মান নেই voidএবং ইউনিটের ধরণের একটি মান থাকতে হবে। এছাড়াও, যেমন আপনি উল্লেখ করেছেন, আপনি এমনকি প্রকারের মান ঘোষণা করতে পারবেন না void, এর অর্থ এটি কোনও প্রকার নয়, ভাষার একটি বিশেষ কোণার ক্ষেত্রেও।
সার্জে বোর্স

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

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

4
@BasileStarynkevitch প্রচলিত পাতার মর্মর হয়েছে শূন্য টাইপ কোনো মানে আছে। এছাড়া রয়েছে নাল টাইপ যা শুধুমাত্র একটি মান প্রতীক হয়েছে nil(ওরফে, ()), যা একটি ইউনিট প্রকার।
জোশুয়া টেলর

উত্তর:


33

আমি একটি সহজ উদাহরণ নেব: সি ++ বনাম জং।

সি ++ 11 এ ব্যতিক্রম ছুঁড়ে ফেলার জন্য এখানে একটি ফাংশন ব্যবহৃত হচ্ছে:

[[noreturn]] void ThrowException(char const* message,
                                 char const* file,
                                 int line,
                                 char const* function);

এবং এখানে জং এর সমতুল্য:

fn formatted_panic(message: &str, file: &str, line: isize, function: &str) -> !;

খাঁটি সিনট্যাকটিক বিষয়ে, মরিচা গঠন আরও বুদ্ধিমান। মনে রাখবেন যে সি ++ টি নির্মাণ এটি একটি রিটার্নের ধরণ নির্দিষ্ট করে যদিও এটি এটি নির্দিষ্ট করে যে এটি ফিরে আসবে না। কিছুটা অদ্ভুত।

একটি স্ট্যান্ডার্ড নোটে, সি ++ বাক্য গঠন কেবল সি ++ 11 (এটি শীর্ষে ট্যাক করা হয়েছিল) দিয়ে হাজির হয়েছিল, তবে বিভিন্ন সংকলক কিছু সময়ের জন্য বিভিন্ন এক্সটেনশান সরবরাহ করে যাচ্ছিল, যাতে তৃতীয় পক্ষের বিশ্লেষণ সরঞ্জামগুলি বিভিন্ন উপায়ে সনাক্ত করার জন্য প্রোগ্রাম করা হত এই বৈশিষ্ট্যটি লেখা যেতে পারে। এটি মানসম্পন্ন করা অবশ্যই স্পষ্টতই উচ্চতর।


এখন, সুবিধা হিসাবে?

কোনও ফাংশন ফিরে না আসে তার জন্য এটি কার্যকর হতে পারে:

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

6
voidআপনার সি ++ উদাহরণে ফাংশনের ধরণ (অংশ) সংজ্ঞায়িত করে - রিটার্নের ধরণ নয়। এটি ক্রিয়াকলাপের জন্য অনুমোদিত মানকে সীমাবদ্ধ করে না return; অকার্যকর রূপান্তর করতে পারে যে কিছুই (যা কিছুই নয়)। যদি ফাংশনটি হয় তবে returnএটি অবশ্যই কোনও মান অনুসরণ করবে না। পুরো ফাংশনটি হ'ল void () (char const*, char const*, int, char const *)। +1 ব্যবহার করার জন্য char constপরিবর্তে const char:-)
পরিস্কার

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

2
আসলে, "ফিরে আসে না" এবং "রিটার্ন-টাইপ এক্স আছে" স্বাধীন করার একটি কারণ রয়েছে: কলিং-কনভেনশনটি রিটার্ন-টাইপের উপর নির্ভর করতে পারে বলে আপনার নিজস্ব কোডের জন্য পিছনে-সামঞ্জস্য।
ডুডলিপিকেটর

হয় [[noreturn]] সিনট্যাক্স বা কার্যকারিতা একজন উপরন্তু এর সমাবস্থা?
জায়েবিস

1
[অবিরত] সামগ্রিকভাবে, আমি কেবল এটাই বলতে পারি যে ⊥ এর সুবিধার উপর একটি আলোচনার মাধ্যমে def এর বাস্তবায়ন হিসাবে কী যোগ্যতা অর্জন করে তা নির্ধারণ করতে হবে; এবং আমি মনে করি না যে কোনও ধরণের সিস্টেম নেই ( a → ⊥) ≤ ( ab ) have এর কার্যকর প্রয়োগ is সুতরাং এই অর্থে SysV x86-64 সি এবিআই (অন্যদের মধ্যে) কেবল বাস্তবায়ন করতে দেয় না ⊥
অ্যালেক্স শ্পিলকিন

26

কার্ল এর উত্তর ভাল। এখানে একটি অতিরিক্ত ব্যবহার রয়েছে যা আমি অন্য কারও উল্লেখ করেছেন বলে মনে করি না। ধরণের

if E then A else B

একটি টাইপ যে ধরনের সব মান অন্তর্ভুক্ত হওয়া উচিত Aএবং ধরনের সব মান B। ধরণ যদি Bহয় Nothing, তাহলে ধরণ ifমত প্রকাশের ধরনের হতে পারে A। আমি প্রায়শই একটি রুটিন ঘোষণা করব

def unreachable( s:String ) : Nothing = throw new AssertionError("Unreachable "+s) 

এই কোডটি পৌঁছানোর আশা করা হয় না তা বলার জন্য। যেহেতু এর ধরণ Nothing, ফলাফলের ধরণের প্রভাব ছাড়াই unreachable(s)এখন যে কোনও ifবা (প্রায়শই) ব্যবহৃত switchহতে পারে। উদাহরণ স্বরূপ

 val colour : Colour := switch state of
         BLACK_TO_MOVE: BLACK
         WHITE_TO_MOVE: WHITE
         default: unreachable("Bad state")

স্কালার এ জাতীয় কিছু নয়।

Nothing(কার্লের উত্তরে উল্লিখিত) এর জন্য আরেকটি ব্যবহারের ক্ষেত্র হ'ল তালিকা [কিছুই নয়] হ'ল তালিকার ধরণ যার প্রত্যেকের সদস্যের কাছে কিছুই নেই টাইপ করা। সুতরাং এটি খালি তালিকার ধরণ হতে পারে।

মূল সম্পত্তি Nothingযে এই ব্যবহারের ক্ষেত্রে কাজ করে তোলে না এটা কোন মান --although Scala এ, উদাহরণস্বরূপ, এটি মান এটা এটি প্রত্যেক অন্যান্য ধরনের উপপ্রকার হয় আছে কোন রয়েছে।

মনে করুন আপনার কাছে এমন একটি ভাষা রয়েছে যেখানে প্রতিটি ধরণের একই মান থাকে - আসুন এটি কল করুন ()। এই জাতীয় ভাষায় ইউনিট টাইপ, যার ()একমাত্র মান হিসাবে এটি প্রতিটি ধরণের একটি উপ টাইপ হতে পারে। এটি ওপি বলতে বোঝায় যে এটি নীচের ধরণের নয়; ওপি স্পষ্ট ছিল যে নীচের ধরণের কোনও মান নেই। তবে এটি যেহেতু এটি একটি প্রকার যা প্রতিটি ধরণের একটি উপপ্রকার, এটি নীচের প্রকারের মতো একই ভূমিকা নিতে পারে।

হাস্কেল কিছুটা আলাদাভাবে কাজ করে। হাসকেলে, একটি অভিব্যক্তি যা কখনই কোনও মান দেয় না টাইপ স্কিম থাকতে পারে forall a.a। এই ধরণের স্কিমের উদাহরণটি অন্য যে কোনও ধরণের সাথে একত্রিত হবে, সুতরাং এটি কার্যকরভাবে নীচের ধরণের হিসাবে কাজ করে, যদিও (মানক) হাস্কেলের সাব টাইপিংয়ের কোনও ধারণা নেই। উদাহরণস্বরূপ, errorস্ট্যান্ডার্ড প্রিলিওড থেকে ফাংশনটিতে টাইপ স্কিম রয়েছে forall a. [Char] -> a। সুতরাং আপনি লিখতে পারেন

if E then A else error ""

এবং যে Aকোনও অভিব্যক্তির জন্য প্রকাশের ধরণ একই ধরণের হবে A

হাস্কেলের খালি তালিকায় টাইপ স্কিম রয়েছে forall a. [a]। যদি Aএমন কোনও অভিব্যক্তি হয় যার प्रकार তালিকার ধরণ, তবে

if E then A else []

একই ধরণের একটি এক্সপ্রেশন A


হাস্কেলের ধরণ forall a . [a]এবং প্রকারের মধ্যে পার্থক্য কী [a]? টাইপ ভেরিয়েবলগুলি কি ইতিমধ্যে সার্কেলভাবে হাস্কেল প্রকারের এক্সপ্রেশনগুলিতে পরিমাণযুক্ত?
জর্জিও

@ জর্জিও ইন হ্যাসকেলে সার্বজনীন পরিমাপের বিষয়টি অন্তর্নিহিত যদি আপনি স্পেসিফিক হন যে আপনি কোনও ধরণের স্কিমের দিকে তাকিয়ে আছেন। আপনি forallস্ট্যান্ডার্ড হাস্কেল ২০১০-তেও লিখতে পারবেন না I আমি স্পষ্টভাবে এই অনুমানটি লিখেছিলাম কারণ এটি হাস্কেল ফোরাম নয় এবং কিছু লোক হাস্কেলের সম্মেলনের সাথে পরিচিত নাও হতে পারে। সুতরাং সেখানে কোনও পার্থক্য নেই যেটি forall a . [a]মানক না হলেও [a]রয়েছে whereas
থিওডোর নরভেল

19

প্রকারভেদ একটি ফর্ম monoid দুইভাবে, একসঙ্গে একটি উপার্জন semiringএটিকেই বীজগণিত সম্পর্কিত ডেটা টাইপ বলা হয় । সীমাবদ্ধ প্রকারের জন্য, এই সেমিরিংটি সরাসরি প্রাকৃতিক সংখ্যার (শূন্য সহ) সেমিরিংয়ের সাথে সম্পর্কিত, যার অর্থ আপনি প্রকারের কতগুলি সম্ভাব্য মান রয়েছে তা গণনা করেন ("নির্বিঘ্ন মানগুলি বাদ দিয়ে)"।

  • নীচে প্রকার (আমি এটা ডাকবো Vacuous) শূন্য মান আছে
  • ইউনিটের ধরণের একটি মান রয়েছে। আমি টাইপ এবং তার একক মান উভয় কল করব ()
  • রচনা (যা বেশিরভাগ প্রোগ্রামিং ভাষাগুলি প্রত্যক্ষভাবে সমর্থন করে, রেকর্ড / স্ট্রাক্ট / সার্বজনীন ক্ষেত্র সহ শ্রেণীর মাধ্যমে) একটি পণ্য ক্রিয়াকলাপ। উদাহরণস্বরূপ, (Bool, Bool)চার সম্ভাব্য মান, যথা হয়েছে (False,False), (False,True), (True,False)এবং (True,True)
    ইউনিট প্রকারটি রচনা ক্রিয়াকলাপের পরিচয় উপাদান। উদাহরণস্বরূপ ((), False)এবং ((), True)টাইপের একমাত্র মান ((), Bool), সুতরাং এই ধরণেরটি Boolনিজের কাছে আইসোমোরফিক ।
  • বিকল্প ধরণের বেশিরভাগ ভাষায় কিছুটা অবহেলিত হয় (ওও ভাষাগুলি তাদেরকে উত্তরাধিকার হিসাবে সমর্থন করে) তবে সেগুলিও কম কার্যকর নয়। দুই ধরনের মধ্যে একটি বিকল্প Aএবং Bমূলত সব মান আছে A, প্লাস এর সব মান B, অত সমষ্টি টাইপ । উদাহরণস্বরূপ, Either () Boolতিন মান আছে, আমি তাদের ডাকবো Left (), Right Falseএবং Right True
    : নীচে টাইপ সমষ্টি পরিচয় উপাদান Either Vacuous Aরয়েছে শুধুমাত্র ফর্ম মান Right aকারণ, Left ...ইন্দ্রিয় (দেখা যায় না Vacuousকোনো মান নেই আছে)।

এসব monoids সম্পর্কে আকর্ষণীয় যে, যখন আপনাকে পরিচয় করিয়ে হয় ফাংশন আপনার ভাষা থেকে, বিভাগ morphisms হিসাবে ফাংশন সঙ্গে এই ধরনের হয় monoidal বিভাগ । অন্যান্য জিনিসের মধ্যে এটি আপনাকে প্রয়োগমূলক ফান্টেক্টর এবং মোনাডগুলি সংজ্ঞায়িত করতে দেয় , যা অন্যথায় নিখুঁত কার্যকরী শর্তাদির মধ্যে সাধারণ গণনাগুলির (সম্ভবত পার্শ্ব-প্রতিক্রিয়া ইত্যাদির জড়িত ইত্যাদি) জন্য একটি দুর্দান্ত বিমূর্ততা হিসাবে দেখা দেয়।

এখন, আপনি ইস্যুটির কেবলমাত্র এক দিক (কম্পোজিশন মনোয়েড) নিয়ে চিন্তিত হয়ে বেশ কিছুটা পেতে পারেন, তবে আপনার স্পষ্টভাবে নীচের ধরণের প্রয়োজন নেই। উদাহরণস্বরূপ, এমনকি হাস্কেল দীর্ঘ সময় ধরে একটি আদর্শ নীচের প্রকার নেই। এখন এটি, বলা হয় Void

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

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


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


"নীচের প্রকার (আমি এটি কল করব Void)", যা মানটির সাথে বিভ্রান্ত হওয়ার দরকার নেই bottom, যা হাস্কেলের যে কোনও ধরণের সদস্য ।
এমবি 21

18

হতে পারে এটি চিরকালের জন্য লুপ হয়ে যায়, অথবা এটি ব্যতিক্রম ছুঁড়ে দেয়।

এই পরিস্থিতিতে একটি দরকারী টাইপের মতো শোনায়, বিরল হলেও তা হতে পারে।

এছাড়াও, যদিও Nothing(নীচের ধরণের জন্য স্কালার নাম) এর কোনও মান থাকতে পারে না, List[Nothing]সেই সীমাবদ্ধতা নেই, যা খালি তালিকার ধরণ হিসাবে এটি কার্যকর করে তোলে। বেশিরভাগ ভাষাগুলি খালি ইন্টিজারগুলির খালি তালিকার চেয়ে আলাদা ধরণের স্ট্রিংয়ের তালিকা তৈরি করে এ জাতীয় ধারণা তৈরি করে, তবে খালি তালিকাটি লেখার জন্য আরও ভার্বোস করে তোলে, যা একটি তালিকা-ভিত্তিক ভাষায় একটি বড় অপূর্ণতা।


12
"হাস্কেলের খালি তালিকাটি এক ধরণের নির্মাতা": অবশ্যই এখানে প্রাসঙ্গিক বিষয়টি এটি পলিমারফিক বা অত্যধিক লোড - এটি হ'ল বিভিন্ন ধরণের খালি তালিকা স্বতন্ত্র মান, তবে সেগুলির []সবগুলিকে উপস্থাপন করে এবং এতে তাত্ক্ষণিকভাবে স্থাপন করা হবে প্রয়োজনীয় হিসাবে নির্দিষ্ট টাইপ।
পিটার লেফানু লামসডাইন

উত্সাহের ব্যাপার হল: আপনি Haskell, অনুবাদক খালি অ্যারে তৈরি করার চেষ্টা করেন, তাহলে আপনি একটি খুব অনির্দিষ্ট ধরনের সঙ্গে একটি খুব নির্দিষ্ট মান পাবেন: [a]। একইভাবে, :t Left 1ফলন Num a => Either a b। প্রকৃতপক্ষে অভিব্যক্তিটি মূল্যায়ন করা ধরণের প্রকারকে জোর করে a, তবে তা নয় b:Either Integer b
জন ডিভোরাক

5
খালি তালিকাটি একটি মান নির্মাতা। কিছুটা বিভ্রান্তিকরভাবে, জড়িত টাইপ কনস্ট্রাক্টরের একই নাম থাকলেও খালি তালিকাটি নিজেই একটি মান নয় (ভাল, টাইপ স্তরের তালিকাগুলিও খুব বেশি, তবে এটি সম্পূর্ণ অন্য বিষয়)। যে অংশটি কোনও তালিকার ধরণের জন্য খালি তালিকার কাজ করে তা হ'ল forallতার প্রকারের মধ্যে অন্তর্ভুক্ত forall a. [a]। চিন্তা করার কিছু সুন্দর উপায় আছে forallতবে সত্যই তা খুঁজে বের করতে কিছুটা সময় লাগে না।
ডেভিড

@ পিটারলিফানু লামসডাইন এই ধরণের নির্মাণকারী হওয়ার অর্থ exactly এটা ঠিক এটা এক ধরনের থেকে আলাদা সাথে একটি TYPE মানে *
গ্রেগরোস

2
হাসকেলে []একটি প্রকার নির্মাতা এবং []খালি তালিকার প্রতিনিধিত্বকারী একটি অভিব্যক্তি। তবে এর অর্থ এই নয় যে "হাস্কেলের খালি তালিকাটি একটি প্রকার নির্মাতা"। প্রসঙ্গটি এটি পরিষ্কার করে দেয় যে []প্রকার হিসাবে বা একটি অভিব্যক্তি হিসাবে ব্যবহৃত হচ্ছে। মনে করুন আপনি ঘোষণা করেন data Foo x = Foo | Bar x (Foo x); এখন আপনি Fooটাইপ কনস্ট্রাক্টর বা মান হিসাবে ব্যবহার করতে পারেন তবে উভয়ের জন্য একই নামটি বেছে নেওয়ার ঘটনাটি ঘটেছে।
থিওডোর নরভেল

3

স্থির বিশ্লেষণের জন্য কোনও নির্দিষ্ট কোড পাথ পৌঁছনীয় নয় এই সত্যটি নথিভুক্ত করার জন্য এটি দরকারী। উদাহরণস্বরূপ আপনি যদি সি # তে নিম্নলিখিতটি লিখেন:

int F(int arg) {
 if (arg != 0)
  return arg + 1; //some computation
 else
  Assert(false); //this throws but the compiler does not know that
}
void Assert(bool cond) { if (!cond) throw ...; }

সংকলকটি অভিযোগ করবে যে Fকমপক্ষে একটি কোডের পথে কোনও কিছু ফেরত দেয় না। তাহলে Assertছিল চিহ্নিত করা অ ফিরে কম্পাইলার সতর্ক করতে প্রয়োজন হত না।


2

কিছু ভাষায়, nullনীচের প্রকারটি রয়েছে, যেহেতু সমস্ত প্রকারের উপ-প্রকারগুলি ভাষাগুলি কীভাবে নাল ব্যবহার করে তার জন্য সুন্দরভাবে সংজ্ঞা দেয় ( nullকেন botনির্বাসিত হওয়া উচিত সে সম্পর্কে সাধারণ তর্কগুলি এড়িয়ে গিয়ে নিজেই ফিরে আসে এমন ফাংশন উভয়ই হওয়ার মৃদু দ্বন্দ্ব সত্ত্বেও )।

এটি any -> botপ্রেরণকে দূরে রেখে হ্যান্ডেল করতে ফাংশনের ধরণগুলিতে ক্যাচ-অল হিসাবেও ব্যবহৃত হতে পারে ।

এবং কিছু ভাষাগুলি আপনাকে আসলে botএকটি ত্রুটি হিসাবে সমাধানের অনুমতি দেয় যা কাস্টম সংকলক ত্রুটিগুলি সরবরাহ করতে ব্যবহার করা যেতে পারে।


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

@ বেসাইলস্টারিঙ্কেভিচ - আমি ইউনিটের ধরণের কথা বলছি না। voidসাধারণ ভাষায় ইউনিট টাইপ করে মানচিত্রগুলি (একই ব্যবহারের জন্য কিছুটা আলাদা শব্দার্থবিজ্ঞানের হলেও) নয় null। যদিও আপনি ঠিক বলেছেন যে বেশিরভাগ ভাষা নীচের ধরণের হিসাবে নਾਲকে মডেল করে না।
তেলস্তিন

3
@ থিডোর নরভেল - ট্যানজেন্টের প্রথম সংস্করণগুলি তা করেছিল - যদিও আমি এটি লেখক, তাই সম্ভবত এটি প্রতারণা করছে। আমার কাছে লিঙ্কগুলি অন্যের জন্য সংরক্ষিত নেই এবং আমি সেই গবেষণাটি করে চলেছি।
তেলস্তিন

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

4
এটি আকর্ষণীয় যে কোনও ভাষার এমন একটি মান রয়েছে যার সাথে আপনি ঘোষণা করতে পারবেন না (নাল আক্ষরিকের জন্য সাধারণ), এবং অন্যের মধ্যে এমন একটি ধরণের রয়েছে যা আপনি ঘোষণা করতে পারেন তবে এর কোনও মান নেই (একটি প্রচলিত নীচের প্রকার) এবং এগুলি কিছুটা তুলনীয় ভূমিকা পূরণ করে ।
মার্টিজন

1

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

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

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

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


তাই ধারণা যে var foo = someCondition() ? functionReturningBar() : functionThatAlwaysThrows()ধরণ অনুমান পারে fooযেমন Bar, যেহেতু অভিব্যক্তি অন্য কিছু উত্পাদ না পারে?
সুপারক্যাট

1
আপনি নিজের ইউনিটের প্রকারটি কমপক্ষে আপনার উত্তরের প্রথম অংশে বর্ণনা করেছেন। ইউনিট প্রকারটি প্রদান করে এমন একটি ফাংশন voidসি হিসাবে প্রত্যাবর্তন হিসাবে ঘোষিত একইরূপে আপনার উত্তরের দ্বিতীয় অংশ যেখানে আপনি কোনও ফাংশনের জন্য এমন কোনও প্রকারের কথা বলেন যা কখনই ফিরে আসে না, বা কোনও উপাদান নেই এমন একটি তালিকা - যা সত্যই নীচের ধরণের! (এটি প্রায়শই _|_পরিবর্তে লেখা হয় *why কেন তা নিশ্চিত নয়
Perhaps

2
সন্দেহ এড়ানোর জন্য: 'দরকারী কিছু ফিরিয়ে দেয় না' 'ফিরে আসে না' থেকে আলাদা; প্রথমটি ইউনিটের ধরণ দ্বারা প্রতিনিধিত্ব করা হয়; নীচে টাইপ দ্বারা দ্বিতীয়।
অ্যান্ড্রুফ

@ অ্যান্ড্রুফ: হ্যাঁ আমি পার্থক্য বুঝতে পারি। আমার উত্তরটি কিছুটা দীর্ঘতর, তবে আমি যে বিন্দুটিটি তৈরি করতে চেয়েছিলাম তা হ'ল ইউনিট টাইপ এবং নীচের প্রকার উভয়ই কিছু নির্দিষ্ট অভিব্যক্তিটিকে আরও নমনীয়ভাবে (তবে এখনও নিরাপদে) ব্যবহার করার অনুমতি দেওয়ার ক্ষেত্রে তুলনামূলক ভূমিকা পালন করে।
মার্ক ভ্যান লিউউইন

@ সুপের্যাট: হ্যাঁ এটাই ধারণা। বর্তমানে C ++ যে বেআইনি, যদিও এটি বৈধ হতে তাহলে functionThatAlwaysThrows()একটি সুনির্দিষ্ট দ্বারা প্রতিস্থাপিত হয়েছে throwস্ট্যান্ডার্ড বিশেষ ভাষা কারণে। এটি করে এমন একটি ধরণ থাকা একটি উন্নতি হবে।
মার্ক ভ্যান লিউউইন

0

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

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

"নীচে" এমন কোনও ধরণ যা কোনও সম্ভাব্য মান নেই। এটি কখনও থাকতে পারে না। যদি কোনও ফাংশন "নীচে" প্রত্যাবর্তন করে তবে এটি আসলে ফিরে আসতে পারে না, কারণ "নীচে" টাইপের কোনও মূল্য নেই যা এটি ফিরে আসতে পারে।

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

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