জাভার ইন্টারফেস এবং হাস্কেলের ধরণের শ্রেণি: পার্থক্য এবং সাদৃশ্য?


112

আমি হাস্কেল শিখার সময় আমি এর ধরণের শ্রেণিটি লক্ষ্য করেছি , যা হাস্কেল থেকে উদ্ভূত একটি দুর্দান্ত আবিষ্কার বলে মনে করা হচ্ছে।

তবে টাইপ শ্রেণিতে উইকিপিডিয়া পৃষ্ঠায় :

প্রোগ্রামার ফাংশন বা ধ্রুবক নামের একটি সেট নির্দিষ্ট করে নির্দিষ্ট প্রকারের সাথে তাদের নিজ নিজ প্রকারের দ্বারা নির্দিষ্ট করে, যা অবশ্যই শ্রেণীর অন্তর্গত প্রতিটি ধরণের জন্য উপস্থিত থাকতে পারে।

যা আমার কাছে জাভার ইন্টারফেসের নিকটবর্তী বলে মনে হয় ( উইকিপিডিয়ায় ইন্টারফেসের (জাভা) পৃষ্ঠাটি উদ্ধৃত করে ):

জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে একটি ইন্টারফেস হল একটি বিমূর্ত প্রকার যা একটি ইন্টারফেস (শব্দটির জেনেরিক অর্থে) নির্দিষ্ট করতে ব্যবহৃত হয় যা ক্লাসগুলি প্রয়োগ করতে হবে।

এই দুটি বরং অনুরূপ দেখাচ্ছে: টাইপ শ্রেণি একটি ধরণের আচরণের সীমাবদ্ধ করে, যখন ইন্টারফেসটি একটি শ্রেণীর আচরণকে সীমাবদ্ধ করে।

আমি আশ্চর্য হই যে হাস্কেল এবং জাভাতে ইন্টারফেসে টাইপ শ্রেণীর মধ্যে পার্থক্য এবং সাদৃশ্য কী, বা সম্ভবত সেগুলি মূলত আলাদা?

সম্পাদনা: আমি লক্ষ্য করেছি এমনকি haskell.org স্বীকার করে যে তারা একই রকম । যদি তারা এতটা অনুরূপ হয় (বা তারা?) তবে টাইপ শ্রেণি কেন এই জাতীয় হাইপ দিয়ে চিকিত্সা করা হয়?

আরও সম্পাদনা: বাহ, অনেক দুর্দান্ত উত্তর! আমার ধারণা, আমাকে সম্প্রদায়টি সিদ্ধান্ত নিতে দেবে যে কোনটি সেরা। যাইহোক, উত্তরগুলি পড়ার সময়, তাদের সকলেই কেবল বলে মনে হয় যে "টাইপক্লাসগুলি এমন অনেক কিছুই করতে পারে যখন ইন্টারফেসটি জেনেরিকগুলি সহ্য করতে পারে না বা করতে পারে না" । আমি সাহায্য করতে পারছি না কিন্তু অবাক হয়ে ভাবছি, টাইপক্ল্যাশগুলি না করতে পারার সময় কি ইন্টারফেসগুলি কিছু করতে পারে? এছাড়াও, আমি লক্ষ্য করেছি যে উইকিপিডিয়া দাবি করেছে যে টাইপক্লাসটি মূলত 1989-র গবেষণাপত্রে উদ্ভাবিত হয়েছিল * "অ্যাড-হক পলিমারফিজমকে কীভাবে কম অ্যাড-হক তৈরি করা যায়", আর হাস্কেল এখনও তার প্যাঁচায় রয়েছেন, যখন জাভা প্রকল্পটি 1991 সালে শুরু হয়েছিল এবং 1995 সালে প্রথম প্রকাশ হয়েছিল। সুতরাং , টাইপক্লাস পরিবর্তে ইন্টারফেসের অনুরূপ হওয়ার পরিবর্তে, অন্যভাবে, ইন্টারফেসগুলি টাইপক্লাস দ্বারা প্রভাবিত হয়েছিল?কোন দলিল / কাগজপত্র সমর্থন বা অস্বীকার আছে? সমস্ত উত্তরের জন্য ধন্যবাদ, তারা সব খুব আলোকিত!

সমস্ত ইনপুট জন্য ধন্যবাদ!


3
না, আসলে ইন্টারফেসগুলি এমন ধরণের শ্রেণিগুলি করতে পারে না এমন কিছু নেই, যা বড় ধরনের সতর্কতার সাথে ইন্টারফেসগুলি সাধারণত ভাষাগুলিতে উপস্থিত হয় যা বিল্ট-ইন বৈশিষ্ট্যগুলি হাস্কেলের মধ্যে পাওয়া যায় নি। জাভাতে টাইপ ক্লাস যুক্ত ছিল, তারা সেই বৈশিষ্ট্যগুলিও ব্যবহার করতে সক্ষম হবে।
সিএ ম্যাককান

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

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

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

8
আরও একটি প্রশ্ন রয়েছে যা এটির যথাযথ নকল হিসাবে বন্ধ করা হয়েছিল, তবে এর আরও গভীর উত্তর রয়েছে: স্ট্যাকওভারফ্লো
বেন

উত্তর:


50

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

এর অর্থ এটি add :: t -> t -> tএকটি ইন্টারফেসের মতো জিনিস তৈরি করা সত্যই শক্ত , যেখানে এটি একাধিক প্যারামিটারের পলিমারফিক হয় কারণ ইন্টারফেসের পক্ষে নির্দিষ্ট করার উপায় নেই যে পদ্ধতিটির আর্গুমেন্ট এবং রিটার্নের ধরণ একই ধরণের is যে বস্তুটির উপরে এটি কল করা হয় (অর্থাত "স্ব" টাইপ)। জেনেরিক্সের সাথে জেনেরিক পরামিতিগুলির সাথে একটি ইন্টারফেস তৈরি করে এটি জাল করার কিছু উপায় রয়েছে যা প্রত্যাশায় একই জিনিস যেমন হয়, যেমন Comparable<T>এটি কীভাবে হয়, যেখানে আপনি ব্যবহার করার প্রত্যাশা করা হয় Foo implements Comparable<Foo>যাতে compareTo(T otherobject)ধরণের টাইপ থাকে t -> t -> Ordering। তবে এটির জন্য প্রোগ্রামারকে এই নিয়মটি অনুসরণ করা প্রয়োজন এবং যখন লোকেরা এই ইন্টারফেসটি ব্যবহার করে এমন কোনও ফাংশন তৈরি করতে চায় তখন তাদের মাথাব্যথার কারণ হয়, তাদের পুনরাবৃত্ত জেনেরিক ধরণের পরামিতি থাকতে হবে।

এছাড়াও, আপনার মতো জিনিস থাকবে না empty :: tকারণ আপনি এখানে কোনও ফাংশন কল করছেন না, তাই এটি কোনও পদ্ধতি নয়।


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

45

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

উপায় ছাড়াই, এখানে কিছু উল্লেখযোগ্য পার্থক্য রয়েছে:

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

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


1
আপনি টাইপচ্লাস কীভাবে প্রসারিত করবেন? ইন্টারফেস কীভাবে ইন্টারফেস প্রসারিত করতে পারে ঠিক একইভাবে টাইপক্লাসগুলি অন্যান্য টাইপক্লাসগুলি বাড়িয়ে দিতে পারে?
সিএমসিডিগ্রাগনকাই

10
ইন্টারফেসে জাভা 8 এর ডিফল্ট বাস্তবায়নগুলির আলোকে এই উত্তরটি আপডেট করার উপযুক্ত হতে পারে।
মনিকা

1
@ সিএমসিডিগ্রাগনকাই হ্যাঁ, আপনি উদাহরণস্বরূপ "শ্রেণি (ফু এ) => বার এথ ..." বলতে পারেন যে বার টাইপ শ্রেণি ফু টাইপের শ্রেণি প্রসারিত করে। জাভার মতো, হাস্কেলেরও এখানে একাধিক উত্তরাধিকার রয়েছে।
মনিকা

এই ক্ষেত্রে ক্লোজুরে প্রোটোকলগুলির মতো টাইপ ক্লাস নয় তবে ধরণের সুরক্ষার সাথে নয়?
নওফাল

24

টাইপ ক্লাসগুলি "অ্যাড-হক পলিমারফিজম" প্রকাশের কাঠামোগত উপায় হিসাবে তৈরি করা হয়েছিল, এটি মূলত ওভারলোডেড ফাংশনগুলির জন্য প্রযুক্তিগত শব্দ । একটি ধরণের শ্রেণিবদ্ধ সংজ্ঞাটি এরকম কিছু দেখায়:

class Foobar a where
    foo :: a -> a -> Bool
    bar :: String -> a

এর অর্থ হ'ল, যখন আপনি fooশ্রেণীর অন্তর্গত কিছু ধরণের আর্গুমেন্টের সাথে ফাংশনটি প্রয়োগ করেন, তখন Foobarএটি fooসেই ধরণের নির্দিষ্টটির একটি বাস্তবায়ন দেখায় এবং এটি ব্যবহার করে that এটি আরও নমনীয় এবং সাধারণীকরণ বাদে সি ++ / সি # এর মতো ভাষায় অপারেটর ওভারলোডিংয়ের সাথে পরিস্থিতিটির সাথে খুব মিল।

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

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

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


আমি হাসকেলে টাইপ হায়ারার্কিগুলি বোঝার সাথে লড়াই করে যাচ্ছিলাম, ওমেগা জাতীয় ধরণের সিস্টেমগুলি সম্পর্কে আপনি কী ভাবেন? তারা কি ধরণের শ্রেণিবিন্যাস অনুকরণ করতে পারে?
সিএমসিডিগ্রাগনকাই

@ সিএমসিডিগ্রাগনকাই: আমি ওমেগার সাথে সত্যিকারের মতো বলার পক্ষে তেমন পরিচিত নই, দুঃখিত
সিএ ম্যাকক্যান

16

আমি উপরের উত্তরগুলি পড়েছি। আমি মনে করি আমি আরও স্পষ্টভাবে উত্তর দিতে পারি:

একটি হাস্কেল "টাইপ শ্রেণি" এবং একটি জাভা / সি # "ইন্টারফেস" বা একটি স্কালা "বৈশিষ্ট্য" মূলত সাদৃশ্যপূর্ণ। তাদের মধ্যে কোনও ধারণাগত পার্থক্য নেই তবে বাস্তবায়নের পার্থক্য রয়েছে:

  • Haskell প্রকারের ক্লাসগুলি "উদাহরণ" দিয়ে প্রয়োগ করা হয় যা ডেটা ধরণের সংজ্ঞা থেকে পৃথক। সি # / জাভা / স্কালায়, ইন্টারফেস / বৈশিষ্ট্যগুলি অবশ্যই শ্রেণীর সংজ্ঞাতে প্রয়োগ করা উচিত।
  • হাস্কেল প্রকারের ক্লাসগুলি আপনাকে এই ধরণের বা স্ব-ধরণের ফেরত দিতে দেয়। স্কেলাল বৈশিষ্ট্যগুলিও এটি করে (এটি.প্রকার)। নোট করুন যে স্কালায় "স্ব ধরণের" সম্পূর্ণরূপে সম্পর্কিত নয় feature জাভা / সি # এর আচরণের আনুমানিক জন্য জেনারিকগুলির সাথে একটি অগোছালো কাজের প্রয়োজন।
  • হাস্কেল প্রকারের ক্লাসগুলি আপনাকে ইনপুট "এই" ধরণের পরামিতি ছাড়াই ফাংশনগুলি (ধ্রুবক সহ) সংজ্ঞায়িত করতে দেয়। জাভা / সি # ইন্টারফেস এবং স্কালা বৈশিষ্ট্যের জন্য সমস্ত ফাংশনে একটি "এই" ইনপুট পরামিতি প্রয়োজন।
  • হাস্কেল প্রকারের ক্লাসগুলি আপনাকে ফাংশনগুলির জন্য ডিফল্ট প্রয়োগগুলি সংজ্ঞায়িত করতে দেয়। সুতরাং স্কালা বৈশিষ্ট্য এবং জাভা 8+ ইন্টারফেস। সি # এক্সটেনশন পদ্ধতিগুলির সাথে এরকম কিছু আনুমানিক করতে পারে।

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

আমি মনে করি ডিফল্ট বাস্তবায়নগুলির মতো জিনিসের জন্য কিছু আনুমানিকতা সম্ভবত # বিমূর্ত শ্রেণীর সাথে আরও দক্ষতার সাথে করা হয়?
অরউইন

12

ইন প্রোগ্রামিং মাস্টার হৃদয় ও মন জয় , সেখানে ফিল Wadler টাইপ ক্লাস উদ্ভাবক, যারা মধ্যে Haskell জাভা ইন্টারফেসগুলি লিখুন শ্রেণীর মধ্যে মিল ব্যাখ্যা সঙ্গে Haskell, সম্পর্কে একটি সাক্ষাত্কারে আছে:

একটি জাভা পদ্ধতি:

   public static <T extends Comparable<T>> T min (T x, T y) 
   {
      if (x.compare(y) < 0)
            return x; 
      else
            return y; 
   }

হাস্কেল পদ্ধতির সাথে খুব মিল:

   min :: Ord a => a -> a -> a
   min x y  = if x < y then x else y

সুতরাং, প্রকারের ক্লাসগুলি ইন্টারফেসের সাথে সম্পর্কিত, তবে প্রকৃত চিঠিপত্রটি একটি স্ট্যাটিক পদ্ধতি হিসাবে উপরের মতো কোনও প্রকারের সাথে প্যারামিটারাইজড হবে।


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

10

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


1
প্রাসঙ্গিক স্টাফ কোথাও কোথাও প্রায় 25 মিটার (যদিও শুরুটি বেশ মজার)।
ফ্রেড ফু

8

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

কাগজে তালিকাভুক্ত উদাহরণগুলি হ'ল:

  • অভিব্যক্তি সমস্যা,
  • কাঠামো সংহতকরণ সমস্যা,
  • স্বাধীন এক্সটেনসিবিলিটি সমস্যা,
  • প্রভাবশালী পচনের অত্যাচার, ছড়িয়ে ছিটিয়ে থাকা এবং জটলা।

3
লিঙ্ক উপরে মারা গেছে। পরিবর্তে এটি চেষ্টা করুন ।
জাস্টিন লেটজেব

1
ভাল এখন যে একজন মারা গেছে। ব্যবহার করে দেখুন এই এক
RichardW

7

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

class  Eq a  where
  (==), (/=) :: a -> a -> Bool
  x /= y     = not (x == y)
  x == y     = not (x /= y)

যা দেখায় যে দুটি ক্রিয়াকলাপ সমান (==)এবং সমান নয় (/=)thingsEq প্রকার শ্রেণীর । তবে সমান নয় এমন অপারেশনটিকে সমান ক্ষেত্রে (যাতে আপনাকে কেবল একটি সরবরাহ করতে হবে) এবং এর বিপরীতে সংজ্ঞায়িত করা হয়।

সুতরাং সম্ভবত-আইন-জাভাতে যা এমন কিছু হবে:

interface Equal<T> {
    bool isEqual(T other) {
        return !isNotEqual(other); 
    }

    bool isNotEqual(T other) {
        return !isEqual(other); 
    }
}

এবং এটি যেভাবে কাজ করবে তা হ'ল ইন্টারফেসটি বাস্তবায়নের জন্য আপনাকে কেবল সেই পদ্ধতিগুলির মধ্যে একটি সরবরাহ করতে হবে। সুতরাং আমি বলব যে ইন্টারফেস স্তরে আপনি যে আচরণ চান তা এক ধরণের আংশিক বাস্তবায়ন করার ক্ষমতা একটি পার্থক্য।


6

এগুলি একই রকম (পড়ুন: একইরকম ব্যবহার রয়েছে), এবং সম্ভবত একইভাবে প্রয়োগ করা হয়েছে: হাস্কেলের পলিমারফিক ফাংশনগুলি টাইপক্লাসের সাথে সম্পর্কিত ফাংশনগুলির তালিকা তৈরি করে একটি 'ভিটিবেল' under

এই টেবিলটি প্রায়শই সংকলনের সময় বাদ দেওয়া যেতে পারে। এটি সম্ভবত জাভাতে কম সত্য।

তবে এটি কার্যগুলির একটি সারণী , পদ্ধতি নয় । পদ্ধতিগুলি কোনও অবজেক্টের সাথে আবদ্ধ, হাস্কেল টাইপচ্লাসগুলি নয়।

এগুলি জাভা জেনেরিকের মতো দেখুন।


3

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

আর একটি পার্থক্য হ'ল আপনি কোনও ধরণের উপর ভিত্তি করে পদ্ধতিগুলি ব্যবহার করতে পারেন, এমনকি যখন আপনার কাছে এখনও সেই ধরণের কোনও কংক্রিট মান না থাকে!

উদাহরণস্বরূপ read :: Read a => String -> a,। সুতরাং আপনি যদি "পড়ার" ফলাফলটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আপনার কাছে যদি অন্য ধরণের তথ্য ঝুলতে থাকে তবে আপনি আপনার জন্য কোন অভিধানটি ব্যবহার করবেন তা সংকলকটি নির্ধারণ করতে পারেন।

মত এছাড়াও আপনি জিনিস করতে পারেন instance (Read a) => Read [a] where..., যা তোমাদের জন্য একটি পঠিত উদাহরণস্বরূপ সংজ্ঞায়িত করতে দেয় কোন পাঠযোগ্য জিনিসগুলির তালিকার । আমি জাভাতে এটি বেশ সম্ভব বলে মনে করি না।

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


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