অস্তিত্বের ধরণ কী?


171

আমি উইকিপিডিয়া নিবন্ধ অস্তিত্বের প্রকারের মাধ্যমে পড়ি । আমি একত্রিত হয়েছি যে অস্তিত্বহীন অপারেটরের (∃) কারণেই তাদের অস্তিত্বের ধরণ বলা হয়। যদিও এর মূল বক্তব্যটি আমি নিশ্চিত না। এর মধ্যে পার্থক্য কী

T = ∃X { X a; int f(X); }

এবং

T = ∀x { X a; int f(X); }

?


8
এটি প্রোগ্রামার্স.স্ট্যাককেক্সচেঞ্জ.কমের জন্য একটি ভাল বিষয় হতে পারে। programmers.stackexchange.com
jpierson

উত্তর:


192

যখন কেউ সর্বজনীন ধরণের সংজ্ঞা দেয় ∀Xতারা বলছেন: আপনি যা যা চান তা প্লাগ করতে পারেন, আমার কাজটি করার জন্য টাইপ সম্পর্কে আমার কিছু জানার দরকার নেই, আমি কেবল এটি স্পষ্টভাবে উল্লেখ করবX

যখন কেউ অস্তিত্বের ধরণের সংজ্ঞা দেয় ∃Xতারা বলছে: আমি এখানে যা চাই তা ব্যবহার করব; আপনি টাইপ সম্পর্কে কিছুই জানতে পারবেন না, তাই আপনি কেবল এটি পরিষ্কার হিসাবে উল্লেখ করতে পারেনX

ইউনিভার্সাল প্রকারগুলি আপনাকে এ জাতীয় জিনিস লিখতে দেয়:

void copy<T>(List<T> source, List<T> dest) {
   ...
}

copyফাংশন কি কোন ধারণা আছে Tআসলে হবে, কিন্তু এটি প্রয়োজন নেই।

অস্তিত্বের ধরণগুলি আপনাকে এ জাতীয় জিনিস লিখতে দেয়:

interface VirtualMachine<B> {
   B compile(String source);
   void run(B bytecode);
}

// Now, if you had a list of VMs you wanted to run on the same input:
void runAllCompilers(List<∃B:VirtualMachine<B>> vms, String source) {
   for (∃B:VirtualMachine<B> vm : vms) {
      B bytecode = vm.compile(source);
      vm.run(bytecode);
   }
}

তালিকার প্রতিটি ভার্চুয়াল মেশিন প্রয়োগের ক্ষেত্রে আলাদা বাইকোড টাইপ থাকতে পারে। runAllCompilersফাংশন কি কোন ধারণা বাইটকোড ধরনের আছে, কিন্তু এটা করার দরকার নেই; সব থেকে বাইটকোড রিলে কি ভাবে VirtualMachine.compileকরতে VirtualMachine.run

জাভা টাইপ ওয়াইল্ডকার্ডস (প্রাক্তন List<?>:) অস্তিত্বের ধরণের একটি খুব সীমাবদ্ধ ফর্ম।

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

// A wrapper that hides the type parameter 'B'
interface VMWrapper {
   void unwrap(VMHandler handler);
}

// A callback (control inversion)
interface VMHandler {
   <B> void handle(VirtualMachine<B> vm);
}

এখন আমরা VMWrapperআমাদের নিজস্ব কল করতে পারি VMHandlerযা সর্বজনীনভাবে টাইপড handleফাংশন রয়েছে। নেট এফেক্ট একই, আমাদের কোডটি Bঅস্বচ্ছ হিসাবে বিবেচনা করতে হবে ।

void runWithAll(List<VMWrapper> vms, final String input)
{
   for (VMWrapper vm : vms) {
      vm.unwrap(new VMHandler() {
         public <B> void handle(VirtualMachine<B> vm) {
            B bytecode = vm.compile(input);
            vm.run(bytecode);
         }
      });
   }
}

ভিএম বাস্তবায়ন উদাহরণ:

class MyVM implements VirtualMachine<byte[]>, VMWrapper {
   public byte[] compile(String input) {
      return null; // TODO: somehow compile the input
   }
   public void run(byte[] bytecode) {
      // TODO: Somehow evaluate 'bytecode'
   }
   public void unwrap(VMHandler handler) {
      handler.handle(this);
   }
}

12
@ ক্যানান, খুব কার্যকর, তবে কিছুটা জটিল-উত্তর করার জন্য +1: ১. আমি মনে করি আপনি যদি অস্তিত্ববাদী এবং সর্বজনীন ধরণের দ্বৈত প্রকৃতি সম্পর্কে আরও সুস্পষ্ট হতে পারতেন তবে এটির সাহায্য হত। আমি দুর্ঘটনাক্রমে কেবল উপলব্ধি করেছিলাম যে আপনি প্রথম দুটি অনুচ্ছেদকে কীভাবে একইভাবে উচ্চারণ করেছেন; কেবলমাত্র পরে আপনি স্পষ্টভাবে বলতে পারেন যে উভয় সংজ্ঞা মূলত একই, তবে "আমি" এবং "আপনি" বিপরীত। এছাড়াও, "আমি" এবং "আপনি" কী উল্লেখ করবেন তা আমি তত্ক্ষণাত বুঝতে পারি নি।
স্টাকাক্স -

2
(অব্যাহত :) ২. আমি List<∃B:VirtualMachine<B>> vmsবা গাণিতিক স্বরলিপিটির অর্থ পুরোপুরি বুঝতে পারি না for (∃B:VirtualMachine<B> vm : vms)। (যেহেতু এগুলি জেনেরিক প্রকারের, তাই আপনি ?"স্ব-তৈরি" সিনট্যাক্সের পরিবর্তে জাভার ওয়াইল্ডকার্ডগুলি ব্যবহার করতে পারবেন না ?) আমার মনে হয় এটি কোনও কোড উদাহরণ পেতে সহায়তা করতে পারে যেখানে জেনেরিক ধরণের যেমন ∃B:VirtualMachine<B>জড়িত না, বরং পরিবর্তে "সোজা" ∃B, কারণ জেনেরিক প্রকারগুলি আপনার প্রথম কোড উদাহরণগুলির পরে সর্বজনীন প্রকারের সাথে সহজেই যুক্ত হয়।
স্টাকেক্স

2
∃Bকোথাও কোয়ালিটিফিকেশন হচ্ছে তা সম্পর্কে আমি স্পষ্ট করে বলতাম used ওয়াইল্ডকার্ড সিনট্যাক্সের সাহায্যে কোয়ান্টিফায়ার অন্তর্ভুক্ত ( List<List<?>>প্রকৃত অর্থ ∃T:List<List<T>>এবং না List<∃T:List<T>>)। এছাড়াও, স্পষ্টত পরিমাণে আপনাকে প্রকারটি উল্লেখ করতে দেয় ( Bঅস্থায়ী ভেরিয়েবলের ধরণের বাইকোড সংরক্ষণ করে এর সুবিধা নিতে আমি উদাহরণটি পরিবর্তন করেছি)।
কান্নান গাউন্ডান

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

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

107

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

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

সুতরাং আপনার উল্লেখ করা দুটি প্রকারের মধ্যে পার্থক্যটি নিম্নরূপ:

T = ∃X { X a; int f(X); }

এর অর্থ: প্রকারের Tমানতে একটি ধরণের নামক Xএকটি মান a:Xএবং একটি ফাংশন থাকে f:X->int। ধরণের মানের একটি উত্পাদক যেকোন প্রকারের জন্য Tচয়ন করতে পারেন এবং গ্রাহক সম্পর্কে কিছুই জানতে পারে না । ছাড়া এক উদাহরণ যে এটা বলা এবং এই মান একটি পরিণত করা যায় যে এটি দিয়ে । অন্য কথায়, টাইপের একটি মান কোনওভাবে কীভাবে উত্পাদন করতে হয় তা জানে । ঠিক আছে, আমরা মধ্যবর্তী প্রকারটি মুছে ফেলতে পারি এবং কেবল বলতে পারি:XXaintfTintX

T = int

সর্বজনীন পরিমাণে কিছুটা আলাদা।

T = ∀X { X a; int f(X); }

এর অর্থ হচ্ছে, ধরনের একটি মান Tকোন প্রকার দেওয়া যেতে পারে X, এবং এটি একটি মান উত্পাদন করা হবে a:X, এবং একটি ফাংশন f:X->int কোন কি কোন ব্যাপার Xহল । অন্য কথায়: ধরণের মানের গ্রাহক যে Tকোনও প্রকারের জন্য চয়ন করতে পারেন X। এবং ধরণের মানের একটি উত্পাদক Tএ সম্পর্কে কিছুই জানতে পারে না X, তবে এটি যে aকোনও পছন্দের জন্য একটি মূল্য উত্পাদন Xকরতে সক্ষম হতে হবে, এবং এই জাতীয় মানটিকে একটি হিসাবে রূপান্তর করতে সক্ষম হতে হবে int

অবশ্যই এই ধরণের বাস্তবায়ন অসম্ভব, কারণ এমন কোনও প্রোগ্রাম নেই যা প্রতিটি কল্পনাযোগ্য ধরণের মান তৈরি করতে পারে। আপনি অবাস্তবতার মতো nullবা বোতল ছাড়ার অনুমতি না দিলে ।

যেহেতু অস্তিত্ব একটি জুটি, তাই অস্তিত্বের যুক্তি তড়িঘড়ি মাধ্যমে সার্বজনীন এক রূপান্তর করা যেতে পারে ।

(∃b. F(b)) -> Int

হিসাবে একই:

∀b. (F(b) -> Int)

প্রাক্তনটি একটি র‌্যাঙ্ক -২ অস্তিত্বহীন। এটি নিম্নলিখিত দরকারী সম্পত্তি বাড়ে:

প্রতিটি অস্তিত্বের পরিমাণে মাপের ধরণের র‌্যাঙ্ক n+1সর্বজনীনভাবে পরিমাণযুক্ত র‌্যাঙ্ক n

অস্তিত্বকে সর্বজনীনতে রূপান্তর করার জন্য একটি স্ট্যান্ডার্ড অ্যালগরিদম রয়েছে, যাকে স্কোলাইমাইজেশন বলা হয়


7
এটা তোলে Skolemization উল্লেখ দরকারী (বা না) হতে পারে en.wikipedia.org/wiki/Skolem_normal_form
জিওফ মধ্যে Reedy

34

আমি মনে করি যে সর্বজনীন প্রকারের সাথে অস্তিত্বের প্রকারগুলি ব্যাখ্যা করার অর্থটি বোধগম্য হয়েছে, যেহেতু দুটি ধারণাটি পরিপূরক, অর্থাৎ একটি অপরটির "বিপরীত"।

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

অস্তিত্বের ধরণগুলি বিভিন্ন উদ্দেশ্যে ব্যবহৃত হতে পারে তবে তারা যা করে তা হ'ল ডানদিকে একটি ধরণের পরিবর্তনশীল ' সাধারণত, ডানদিকে উপস্থিত যে কোনও ধরণের ভেরিয়েবল অবশ্যই বাম দিকে উপস্থিত হতে হবে […]

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

নিম্নলিখিত সিউডো-কোডটি বেশ কার্যকর জাভা নয়, যদিও এটি ঠিক করার পক্ষে এটি যথেষ্ট সহজ হবে। আসলে, আমি ঠিক এই উত্তরটি করতে যাচ্ছি!

class Tree<α>
{
    α       value;
    Tree<α> left;
    Tree<α> right;
}

int height(Tree<α> t)
{
    return (t != null)  ?  1 + max( height(t.left), height(t.right) )
                        :  0;
}

আমি আপনার জন্য এটি সংক্ষেপে বানান। আমরা সংজ্ঞা দিচ্ছি ...

  • একটি পুনরাবৃত্ত প্রকার Tree<α>যা বাইনারি গাছের নোডকে উপস্থাপন করে। প্রতিটি নোড valueকিছু প্রকারের একটি সঞ্চয় করে α এবং একই ধরণের alচ্ছিক leftএবং rightসাবট্রির উল্লেখ রয়েছে ।

  • কোনও ফাংশন heightযা কোনও লিফ নোড থেকে মূল নোডের সর্বাধিক দূরত্বে ফিরে আসে t

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

1. ইউনিভার্সাল ধরণের সমাধান:

সবচেয়ে বড় ফিক্স কেবল করা হয় heightটাইপ প্যারামিটার প্রবর্তনের দ্বারা জেনেরিক α তার স্বাক্ষর মধ্যে:

<α> int height(Tree<α> t)
{
    return (t != null)  ?  1 + max( height(t.left), height(t.right) )
                        :  0;
}

এটি আপনাকে ভেরিয়েবলগুলি ঘোষণা করতে এবং প্রকারের ভিতরে α ফাংশনের ভিতরে ভাবটি তৈরি করতে দেয়, যদি আপনি চান। কিন্তু ...

2. অস্তিত্বের ধরণের সমাধান:

আপনি যদি আমাদের পদ্ধতি লাশ তাকান, তাহলে আপনি আসলে আমরা অ্যাক্সেস করছি না, অথবা, টাইপ কিছু কাজ লক্ষ্য করবেন α ! সেই ধরণের কোনও এক্সপ্রেশন নেই বা সেই ধরণের সাথে কোনও ভেরিয়েবল ঘোষিত হয়নি ... সুতরাং, কেন আমাদের heightআদৌ জেনারিক করতে হবে? কেন আমরা কেবল সম্পর্কে ভুলবেন না পারেন α ? এটি সক্রিয় হিসাবে, আমরা এটি করতে পারি:

int height(Tree<?> t)
{
    return (t != null)  ?  1 + max( height(t.left), height(t.right) )
                        :  0;
}

আমি এই উত্তরের প্রথমদিকে যেমন লিখেছি, অস্তিত্বমূলক এবং সর্বজনীন প্রকারগুলি প্রকৃতির পরিপূরক / দ্বৈত। সুতরাং, যদি সার্বজনীন টাইপ সমাধান করতে যাচ্ছিলেন height আরো জেনেরিক, তাহলে আমরা আশা করতে পারে যে অস্তিত্ববাদের ধরনের উল্টো প্রভাব আছে: এটি তৈরি কম / জেনেরিক, যথা গোপন করে টাইপ প্যারামিটার অপসারণ α

ফলস্বরূপ, আপনি আর t.valueএই পদ্ধতির প্রকারটি উল্লেখ করতে পারবেন না বা এই ধরণের কোনও অভিব্যক্তি চালিত করতে পারবেন না কারণ কোনও সনাক্তকারী এটির সাথে আবদ্ধ হয়নি। ( ?ওয়াইল্ডকার্ড একটি বিশেষ টোকেন, কোনও শনাক্তকারী নয় যা কোনও ধরণের "ক্যাপচার" করে)) t.valueকার্যকরভাবে অস্বচ্ছ হয়ে উঠেছে; সম্ভবত আপনি কেবল এটির সাথে এখনও এটি করতে পারেন এটি এটিকে টাইপ-কাস্ট করা Object

সারসংক্ষেপ:

===========================================================
                     |    universally       existentially
                     |  quantified type    quantified type
---------------------+-------------------------------------
 calling method      |                  
 needs to know       |        yes                no
 the type argument   |                 
---------------------+-------------------------------------
 called method       |                  
 can use / refer to  |        yes                no  
 the type argument   |                  
=====================+=====================================

3
ভাল ব্যাখ্যা। আপনাকে অবজেক্টের জন্য t.value castালাই করার দরকার নেই, আপনি কেবল এটি অবজেক্ট হিসাবে উল্লেখ করতে পারেন। আমি বলব যে অস্তিত্বের ধরণটি সেই কারণে পদ্ধতিটিকে আরও জেনারেল করে তোলে। T.value সম্পর্কে আপনি কেবলমাত্র জানতে পারবেন তা হ'ল এটি এমন একটি অবজেক্ট যেখানে আপনি about (যেমন Ser সিরিয়ালাইজেবল প্রসারিত) সম্পর্কে সুনির্দিষ্ট কিছু বলতে পারেন।
ক্রেগ পি। মোটলিন

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

1
@ স্টাকেক্স, এই কোডটিতে (কার্যকর জাভা থেকে) public static void swap(List<?> list, int i, int j) { swapHelper(list, i, j); } private static <E> void swapHelper(List<E> list, int i, int j) { list.set(i, list.set(j, list.get(i))); } , Eএকটি universal typeএবং ?একটি প্রতিনিধিত্ব করে existential type?
কেভিন মেরেডিথ

এই উত্তরটি সঠিক নয়। ?ধরনের int height(Tree<?> t)এখনও ফাংশন ভিতরে পরিচিত হয় না এবং এখনও আহ্বানকারী দ্বারা নির্ধারিত করা হয়েছে কারণ এটি আহ্বানকারী যা গাছ মধ্যে পাস করার জন্য চয়ন পেয়েছিলাম হয়। এমনকি যদি মানুষ এই জাভা অস্তিত্ববাদের টাইপ কল, এটা হয় না। ?স্থানধারক করতে জাভা existentials, কিছু পরিস্থিতিতে একটি ফর্ম প্রয়োগ করতে ব্যবহৃত, কিন্তু এই তাদের মধ্যে একজন নয়।
পিটার হল

15

এগুলি সব ভাল উদাহরণ, তবে আমি এর উত্তর কিছুটা আলাদাভাবেই বেছে নিতেছি। গণিত থেকে স্মরণ করুন, যে ∀x। পি (এক্স) এর অর্থ "সমস্ত এক্স এর জন্য, আমি প্রমাণ করতে পারি যে পি (এক্স)"। অন্য কথায়, এটি একধরণের ফাংশন, আপনি আমাকে একটি এক্স দেন এবং আপনার কাছে এটি প্রমাণ করার জন্য আমার কাছে একটি পদ্ধতি রয়েছে।

টাইপ থিওরিতে আমরা প্রুফের কথা বলছি না, প্রকারের কথা বলছি। সুতরাং এই স্থানটিতে আমরা বলতে চাইছি "আপনি আমাকে যে কোনও ধরণের এক্স দিন, আমি আপনাকে একটি নির্দিষ্ট ধরণের পি দেব"। এখন, যেহেতু আমরা এক্স সম্পর্কে আরও অনেক তথ্য দিই না যে এটি একটি প্রকার, তাই পি এর সাথে খুব বেশি কিছু করতে পারে না, তবে এর কয়েকটি উদাহরণ রয়েছে। পি এর "একই ধরনের সমস্ত জোড়া" টাইপ তৈরি করতে পারেন: P<X> = Pair<X, X> = (X, X)। অথবা আমরা বিকল্পের P<X> = Option<X> = X | Nilप्रकारটি তৈরি করতে পারি: যেখানে নীল হল নাল পয়েন্টারগুলির ধরণ। আমরা এটা থেকে বেরিয়ে একটি তালিকা তৈরি করুন: List<X> = (X, List<X>) | Nil। লক্ষ্য করুন যে শেষটি পুনরাবৃত্ত হয়, এর মানগুলি List<X>হয় জোড়া হয় যেখানে প্রথম উপাদানটি একটি এক্স এবং দ্বিতীয় উপাদানটি হয় List<X>অন্যথায় এটি নাল পয়েন্টার।

এখন, গণিতে x পি (এক্স) এর অর্থ "আমি প্রমাণ করতে পারি যে এখানে একটি নির্দিষ্ট এক্স রয়েছে যা পি (এক্স) সত্য"। এ জাতীয় অনেকগুলি এক্স থাকতে পারে তবে এটি প্রমাণ করার জন্য একটি যথেষ্ট। এটি ভাবার আরেকটি উপায় হ'ল প্রমাণ-ও-প্রমাণ যুগলগুলির একটি খালি খালি সেট থাকতে হবে x (x, P (x))}}

টাইপ তত্ত্বে অনুবাদিত: পরিবারে ∃X.P<X>একটি প্রকার হ'ল টাইপ এক্স এবং এর সাথে সম্পর্কিত একটি প্রকার P<X>। লক্ষ্য করুন যে আমরা পি কে এক্স দেওয়ার আগে, (যাতে আমরা এক্স সম্পর্কে পি সম্পর্কে সমস্ত কিছু জানতাম) তবে বিপরীতটি এখন সত্য। P<X>এক্স সম্পর্কে কোনও তথ্য দেওয়ার প্রতিশ্রুতি দেয় না, কেবল আছে যে একটি আছে, এবং এটি সত্যই এক ধরণের।

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


2
হুম তবে এটির P<X>পরিবর্তে এটি কীভাবে জেনে ফাংশনটি লাভ করে P(একই কার্যকারিতা এবং ধারক প্রকার, আসুন বলে নেওয়া যাক, তবে আপনি কি জানেন না এতে রয়েছে X)?
ক্লাদিউ

3
কঠোরভাবে বলতে গেলে, কেবলমাত্র সত্যের ∀x. P(x)প্রবর্তন সম্পর্কে কিছু বোঝায় না P(x)
আর .. গিটহাব বন্ধ হেল্পিং আইসিসি

11

আপনার প্রশ্নের সরাসরি উত্তর দিতে:

সর্বজনীন টাইপের সাথে, ব্যবহারগুলির Tমধ্যে টাইপ প্যারামিটার অন্তর্ভুক্ত থাকতে হবে X। উদাহরণস্বরূপ T<String>বা T<Integer>। অস্তিত্বের ধরণের ব্যবহারের জন্য Tসেই ধরণের পরামিতিটি অন্তর্ভুক্ত করবেন না কারণ এটি অজানা বা অপ্রাসঙ্গিক - কেবল ব্যবহার করুন T(বা জাভাতে T<?>)।

আরো তথ্য:

ইউনিভার্সাল / অ্যাবস্ট্রাক্ট প্রকার এবং অস্তিত্বের ধরণগুলি কোনও বস্তুর / ক্রিয়াকলাপের গ্রাহক / ক্লায়েন্ট এবং এটির উত্পাদনকারী / বাস্তবায়নের মধ্যে দৃষ্টিভঙ্গির দ্বৈততা। যখন এক পক্ষ সর্বজনীন টাইপ দেখায় অন্যদিকে অস্তিত্বের প্রকারটি দেখায়।

জাভাতে আপনি জেনেরিক শ্রেণি সংজ্ঞায়িত করতে পারেন:

public class MyClass<T> {
   // T is existential in here
   T whatever; 
   public MyClass(T w) { this.whatever = w; }

   public static MyClass<?> secretMessage() { return new MyClass("bazzlebleeb"); }
}

// T is universal from out here
MyClass<String> mc1 = new MyClass("foo");
MyClass<Integer> mc2 = new MyClass(123);
MyClass<?> mc3 = MyClass.secretMessage();
  • একটি দৃষ্টিকোণ থেকে ক্লায়েন্ট এর MyClass, Tকারণ আপনার জন্য কোন প্রকার প্রতিস্থাপন করতে পারেন সার্বজনীন Tযখন আপনি যে শ্রেণী ব্যবহার এবং আপনি টি প্রকৃত টাইপ জানেন যখনই আপনি একটি দৃষ্টান্ত ব্যবহার করা আবশ্যকMyClass
  • উদাহরণস্বরূপ পদ্ধতি দৃষ্টিকোণ থেকে MyClassনিজে Tকারণ এটি প্রকৃত টাইপ জানে না অস্তিত্ববাদের হয়T
  • জাভাতে, ?অস্তিত্বের ধরণের প্রতিনিধিত্ব করে - সুতরাং আপনি যখন শ্রেণীর অভ্যন্তরে থাকবেন তখন Tমূলত ?। আপনি যদি অস্তিত্বের MyClassসাথে একটি উদাহরণ পরিচালনা করতে চান তবে উপরের উদাহরণ হিসাবে আপনি Tঘোষণা করতে পারেন ।MyClass<?>secretMessage()

অন্য কোথাও আলোচিত হিসাবে কিছু ক্ষেত্রে বাস্তবায়ন বিবরণ গোপন করতে অস্তিত্বমূলক প্রকারগুলি ব্যবহৃত হয়। এর একটি জাভা সংস্করণটি দেখতে পাওয়া যাবে:

public class ToDraw<T> {
    T obj;
    Function<Pair<T,Graphics>, Void> draw;
    ToDraw(T obj, Function<Pair<T,Graphics>, Void>
    static void draw(ToDraw<?> d, Graphics g) { d.draw.apply(new Pair(d.obj, g)); }
}

// Now you can put these in a list and draw them like so:
List<ToDraw<?>> drawList = ... ;
for(td in drawList) ToDraw.draw(td);

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

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

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

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


11

একটি অস্তিত্বের ধরণ একটি অস্বচ্ছ ধরণের।

ইউনিক্সে একটি ফাইল হ্যান্ডেল চিন্তা করুন। আপনি জানেন যে এর প্রকারটি ইনট, তাই আপনি সহজেই এটি জালিয়াতি করতে পারেন। আপনি উদাহরণস্বরূপ, হ্যান্ডেল ৪৩ থেকে পড়ার চেষ্টা করতে পারেন it যদি এমনটি ঘটে থাকে তবে প্রোগ্রামটির একটি নির্দিষ্ট হ্যান্ডেলটি খোলা আছে, আপনি এটি থেকে পড়বেন। আপনার কোডটি দূষিত হতে হবে না, কেবল স্লোপি (উদাহরণস্বরূপ, হ্যান্ডেলটি অনির্বাচিত পরিবর্তনশীল হতে পারে)।

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

let exfile = fopen("foo.txt"); // No type for exfile!
read(exfile, buf, size);

ইন্টারফেস "রিড" হিসাবে ঘোষণা করা হয়:

টি ধরণের টাইপ রয়েছে যা:

size_t read(T exfile, char* buf, size_t size);

ভেরিয়েবল এক্সফাইল কোনও ইনট নয় char*, স্ট্রাক্ট ফাইল নয় — এমন কিছু যা আপনি টাইপ সিস্টেমে প্রকাশ করতে পারবেন না। আপনি এমন কোনও ভেরিয়েবল ঘোষণা করতে পারবেন না যার প্রকারটি অজানা এবং আপনি সেই অজানা প্রকারের মধ্যে একটি পয়েন্টার বলতে, বলতে পারবেন না। ভাষা আপনাকে অনুমতি দেয় না।


9
এটি কাজ করবে না। এর স্বাক্ষরটি যদি readথাকে ∃T.read(T file, ...)তবে প্রথম প্যারামিটার হিসাবে আপনি পাস করতে পারবেন এমন কিছুই নেই। কাজটি হ'ল fopenফাইল হ্যান্ডেলটি ফিরিয়ে দেওয়া এবং একই অস্তিত্বের দ্বারা পাঠানো একটি ফাংশন :∃T.(T, read(T file, ...))
কান্নান গাউন্ডান

2
এটি কেবল এডিটি সম্পর্কে কথা বলে মনে হচ্ছে।
kizzx2

7

দেখে মনে হচ্ছে আমি কিছুটা দেরিতে এসেছি, তবে যাইহোক, এই নথিতে অস্তিত্বমূলক প্রকারগুলি কী তা সম্পর্কে আরও একটি দৃষ্টিভঙ্গি যুক্ত করেছে, যদিও এটি বিশেষত ভাষা-অজ্ঞাত নয়, অস্তিত্বের ধরণগুলি বোঝার জন্য এটি তখন বেশ সহজ হওয়া উচিত: http: //www.cs.uu .nl / গোষ্ঠী / এসটি / প্রকল্প / এএইচসি / এএইচসি-বই.পিডিএফ (অধ্যায় 8)

সার্বজনীন এবং অস্তিত্বযুক্ত পরিমাণযুক্ত প্রকারের মধ্যে পার্থক্য নিম্নলিখিত পর্যবেক্ষণ দ্বারা চিহ্নিত করা যেতে পারে:

  • ∀ পরিমাণযুক্ত প্রকারের সাথে একটি মানের ব্যবহার কোয়ান্টাইফাইড টাইপ ভেরিয়েবলের ইনস্ট্যান্টেশনের জন্য চয়ন করার জন্য প্রকারটি নির্ধারণ করে। উদাহরণস্বরূপ, পরিচয় ফাংশনটির কলকারী "id :: aaa → a" এই নির্দিষ্ট আইডির জন্য ভেরিয়েবল এ টাইপ বেছে নিতে টাইপ নির্ধারণ করে। ফাংশন অ্যাপ্লিকেশন "আইডি 3" এর জন্য এই টাইপটি ইন্টার এর সমান।

  • ∃ পরিমাণযুক্ত প্রকারের সাথে একটি মানের তৈরি নির্ধারণ করে এবং লুকায়িত করে, পরিমাণযুক্ত প্রকরণের ভেরিয়েবলের প্রকার। উদাহরণস্বরূপ, একটি ".a। (A, a → int)" এর স্রষ্টা "(3, →x → x)" থেকে এই ধরণের একটি মান তৈরি করতে পারেন; অন্য স্রষ্টা "('x', →x → অর্ডার এক্স)" থেকে একই ধরণের একটি মান তৈরি করেছেন। ব্যবহারকারীর দৃষ্টিকোণ থেকে উভয় মানেরই একই ধরণের এবং এইভাবে বিনিময়যোগ্য। মানটি ভেরিয়েবল এ টাইপের জন্য নির্দিষ্ট ধরণের পছন্দ করে তবে কোন প্রকারটি তা আমরা জানি না, সুতরাং এই তথ্যটি আর ব্যবহার করা যাবে না। এই মান নির্দিষ্ট ধরণের তথ্য 'ভুলে গেছে'; আমরা কেবল জানি এটি বিদ্যমান exists


1
যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
শীলক

1
@sheilak: উত্তর আপডেট, পরামর্শের জন্য ধন্যবাদ
themarketka

5

প্রকারের প্যারামিটারগুলির সমস্ত মানের জন্য একটি সর্বজনীন টাইপ বিদ্যমান। একটি বিদ্যমান অস্তিত্ব কেবলমাত্র পরামিতি (গুলি) টাইপের মানগুলির জন্য বিদ্যমান যা অস্তিত্বের ধরণের সীমাবদ্ধতাগুলি পূরণ করে।

উদাহরণস্বরূপ স্কালায় অস্তিত্বের ধরণের প্রকাশের একটি উপায় একটি বিমূর্ত প্রকার যা কিছু উপরের বা নিম্ন সীমানায় সীমাবদ্ধ।

trait Existential {
  type Parameter <: Interface
}

সমতুল্যভাবে একটি সীমাবদ্ধ সর্বজনীন টাইপ হল নীচের উদাহরণের মতো একটি অস্তিত্বমূলক প্রকার।

trait Existential[Parameter <: Interface]

যে কোনও ব্যবহারের সাইট নিয়োগ করতে পারে Interfaceকারণ কোনও তাত্ক্ষণিক সাব টাইপগুলি Existentialঅবশ্যই নির্ধারণ করতে হবে type Parameterযা বাস্তবায়ন করতে হবে Interface

স্কালায় অস্তিত্বের ধরণের একটি অবক্ষয়যুক্ত কেস একটি বিমূর্ত প্রকার যা কখনও উল্লেখ করা হয় না এবং তাই কোনও উপ-টাইপ দ্বারা এটি সংজ্ঞায়িত করার প্রয়োজন হয় না। এটি কার্যকরভাবে List[_] স্কালায় এবং List<?>জাভাতে একটি সংক্ষিপ্ত বিবরণ রয়েছে।

আমার উত্তর মার্টিন ওডারস্কির বিমূর্ত এবং অস্তিত্বের ধরণের একত্রিত করার প্রস্তাব দ্বারা অনুপ্রাণিত হয়েছিল । সহগামী স্লাইড বুঝতে সাহায্য করে।


1
উপরের কিছু উপাদান পড়ার পরে মনে হচ্ছে আপনি সুন্দরভাবে আমার বোঝার সংক্ষিপ্তসার করেছেন: ইউনিভার্সাল প্রকারগুলি, ∀x.f(x)তাদের প্রাপ্ত ফাংশনগুলির জন্য অস্বচ্ছ, যখন অস্তিত্বীয় প্রকার, ∃x.f(x)নির্দিষ্ট বৈশিষ্ট্য থাকার ক্ষেত্রে আবদ্ধ থাকে। সাধারণত, সমস্ত পরামিতি অস্তিত্বযুক্ত যেহেতু তাদের ফাংশনগুলি তাদের সরাসরি পরিচালনা করে; তবে জেনেরিক প্যারামিটারগুলিতে ইউনিভার্সাল জাতীয় প্রকার থাকতে পারে যেহেতু ফাংশনটি এগুলি মৌলিক সার্বজনীন ক্রিয়াকলাপের বাইরে যেমন পরিচালনা হিসাবে কোনও রেফারেন্স অর্জন করবে না:∀x.∃array.copy(src:array[x] dst:array[x]){...}
জর্জ

এখানে বর্ণিত হিসাবে স্ট্যাকওভারফ্লো.com/a/19413755/3195266 ধরণের সদস্যরা পরিচয়ের ধরণের মাধ্যমে সর্বজনীন পরিমাণ নির্ধারণ করতে পারেন। এবং নিশ্চিতভাবে forSomeটাইপ প্যারামিটারের অস্তিত্বের পরিমাণ নির্ধারণের জন্য রয়েছে।
নেत्সু

3

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

দেখা:

অ্যাবস্ট্রাক্ট প্রকারের অস্তিত্বমূলক প্রকার, মিশেল এবং প্লটকিন রয়েছে

http://theory.stanford.edu/~jcm/papers/mitch-plotkin-88.pdf


1

আমি এই চিত্রটি তৈরি করেছি। আমি জানি না এটি কঠোর কিনা। তবে যদি এটি সাহায্য করে তবে আমি আনন্দিত। এখানে চিত্র বর্ণনা লিখুন


-6

আমি যেমন বুঝতে পারি এটি ইন্টারফেস / বিমূর্ত শ্রেণীর বর্ণনা দেওয়ার গণিতের উপায়।

যেমন টি = ∃X {এক্স এ; int f (X); }

সি # এর জন্য এটি জেনেরিক অ্যাবস্ট্রাক্ট প্রকারে অনুবাদ করবে:

abstract class MyType<T>{
    private T a;

    public abstract int f(T x);
}

"অস্তিত্বশীল" এর অর্থ হ'ল এখানে এমন কিছু প্রকার রয়েছে যা এখানে সংজ্ঞায়িত বিধিগুলি মেনে চলে।

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