মরচে ধরণের বৈশিষ্ট্য এবং হাস্কেলের টাইপক্লাসগুলির মধ্যে পার্থক্য কী?


157

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


8
আমি জং সম্পর্কে খুব বেশি জানি না। তবে অন্যান্য ভাষায় অনুরূপ প্রযুক্তির জন্য সাধারণ হোঁচট খাওয়াগুলি উচ্চতর প্রকারের (উদাহরণস্বরূপ প্যারামিটারাইজড ধরণেরগুলির চেয়ে বেশি বৈশিষ্ট্যগুলি হতে পারে তবে তাদের পরামিতিগুলি নয়?) এবং রিটার্ন-টাইপ পলিমারফিজম (উদাহরণস্বরূপ কোনও বৈশিষ্ট্যের ধরণ কোনও ফাংশনের ফলাফলে প্রদর্শিত হতে পারে তবে কোথাও নয় যুক্তিতে?)। হাস্কেলের পূর্বের উদাহরণটি class Functor f where fmap :: (a -> b) -> (f a -> f b); পরেরটির উদাহরণটি class Bounded a where maxBound :: a
ড্যানিয়েল ওয়াগনার

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

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

4
অন্য পার্থক্য হ'ল এতিম দৃষ্টান্তগুলির চিকিত্সা। মরিচা কঠোর সমন্বয়মূলক নিয়ম থাকার চেষ্টা করে যেখানে একটি বৈশিষ্ট্যের জন্য নতুন ইমপ্লিট লেখা যায়। আরও বিস্তারিত তথ্যের জন্য এই আলোচনাটি দেখুন (বিশেষত এখানে )
পাওলো ফালেবেলা

1
মরিচা এখন সম্পর্কিত প্রকার এবং সমতার সীমাবদ্ধতাগুলিকে সমর্থন করে যদিও তারা হাস্কেলের ধরণের পরিবারের মতো শক্তিশালী নয় are বৈশিষ্ট্যযুক্ত বস্তুর মাধ্যমে এটির অস্তিত্বমূলক প্রকারগুলিও রয়েছে ।
লাম্বদা পরী

উত্তর:


61

প্রাথমিক স্তরে, খুব বেশি পার্থক্য নেই, তবে তারা এখনও রয়েছে।

হ্যাস্কেল কোনও টাইপক্লাসে সংজ্ঞায়িত ফাংশন বা মানগুলি 'পদ্ধতি' হিসাবে বর্ণনা করে, যেমন বৈশিষ্ট্যগুলি তারা আবদ্ধ বস্তুগুলিতে ওওপি পদ্ধতিগুলি বর্ণনা করে। যাইহোক, হাস্কেল এগুলিকে আলাদাভাবে ডিল করে, কোনও বস্তুকে OOP হিসাবে পিন করার পরিবর্তে স্বতন্ত্র মান হিসাবে বিবেচনা করে এমনটি করার জন্য নেতৃত্ব দেয়। এটি সর্বাধিক সুস্পষ্ট পৃষ্ঠ-স্তরের পার্থক্য সম্পর্কে।

একটি জিনিস যা রাস্ট কিছুক্ষণের জন্য না করতে পারত তা হ'ল উচ্চ-অর্ডার টাইপযুক্ত বৈশিষ্ট্য , যেমন কুখ্যাত Functorএবং Monadটাইপক্লাস।

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

সুতরাং আমরা যদি এক্সটেনশানগুলিকে অগ্রাহ্য করি তবে সেগুলি হুবহু এক নয়, তবে প্রতিটি অপরটি কী করতে পারে তা অনুমান করতে পারে।

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

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


Has হাস্কেলের টাইপচ্লাসগুলির একটি সুন্দর নিবন্ধ (উচ্চ-টাইপযুক্তগুলি সহ) এখানে পাওয়া যাবে এবং বৈশিষ্টগুলির উপর জাস্ট বাই উদাহরণ অধ্যায়টি এখানে পাওয়া যেতে পারে


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

সংযুক্ত আইটেমগুলি এখন অনেক পরিস্থিতিতে মূর্তিমান হিসাবে বিবেচিত হয়, তাই না?
ভেলাস

@ ভেলাস আপনি ঠিক বলেছেন — এই উত্তরটি কিছুটা আপডেট করা উচিত। এখন সম্পাদনা করা হচ্ছে।
এজেফারমার

19

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

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

    একটি বৈশিষ্ট্য রেফারেন্স ভেরিয়েবল রানটাইমের সময় বিভিন্ন ধরণের অবজেক্টগুলিকে ধারণ করতে পারে, যতক্ষণ না রেফারেন্সযুক্ত অবজেক্টের রানটাইম টাইপটি বৈশিষ্ট্য প্রয়োগ করে।

    // The shape variable might contain a Square or a Circle, 
    // we don't know until runtime
    let shape: &Shape = get_unknown_shape();
    
    // Might contain different kinds of shapes at the same time
    let shapes: Vec<&Shape> = get_shapes();

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

    আপনার কাছে বিভিন্ন ধরণের বিভিন্ন জিনিসের একটি তালিকা থাকতে পারে না যা একই ধরণের শ্রেণি প্রয়োগ করে। (পরিবর্তে, অস্তিত্বের ধরণের একটি অনুরূপ জিনিস প্রকাশ করতে হাস্কেল ব্যবহার করা হয়)) নোট 1

  2. বৈশিষ্ট্য পদ্ধতিগুলি গতিশীলভাবে প্রেরণ করা যেতে পারে । এটি উপরের অংশে বর্ণিত বিষয়গুলির সাথে দৃ strongly়ভাবে সম্পর্কিত।

    ডায়নামিক প্রেরণের অর্থ, যে রেফারেন্সটি বলা হয় তাকে কোন পদ্ধতিটি নির্ধারণের জন্য অবজেক্টের রানটাইম ধরণের একটি রেফারেন্স পয়েন্ট ব্যবহৃত হয়।

    let shape: &Shape = get_unknown_shape();
    
    // This calls a method, which might be Square.area or
    // Circle.area depending on the runtime type of shape
    print!("Area: {}", shape.area());

    আবার, অস্তিত্বমূলক প্রকারগুলি হ্যাসকেলে এর জন্য ব্যবহৃত হয়।

উপসংহারে

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

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


দ্রষ্টব্য 1 : মরিচের সাম্প্রতিক সংস্করণগুলিতে বৈশিষ্ট্যর নামগুলি প্রকার হিসাবে ব্যবহারের বৈশিষ্ট্য এবং বৈশিষ্ট্য নামের সীমানা হিসাবে আলাদা করার জন্য একটি আপডেট রয়েছে। বৈশিষ্ট্য প্রকারে নামটি dynকীওয়ার্ড দ্বারা উপসর্গ করা হয় । আরও তথ্যের জন্য উদাহরণস্বরূপ এই উত্তরটি দেখুন।


2
"প্রকারের শ্রেণিগুলি কোনও প্রকার তৈরি করে না" - আমি মনে করি dyn Traitতারা বৈশিষ্ট্য / টাইপ-শ্রেণীর সাথে সম্পর্কিত হওয়ায় অস্তিত্বের টাইপের একটি রূপ হিসাবে বোঝা ভাল । আমরা dynকোনও অপারেটরকে টাইপগুলিতে প্রক্ষেপণ করতে বাধ্য করতে পারি, যেমন dyn : List Bound -> Type। Haskell,, এবং শুভেচ্ছা সঙ্গে এই ধারণা গ্রহণ "। তাই আপনি বর্গ নামের সঙ্গে ভেরিয়েবল ডিক্লেয়ার করতে পারছি না", আমরা এই পরোক্ষভাবে মধ্যে Haskell করতে পারেন: data Dyn (c :: * -> Constraint) = forall (t :: Type). c t => D t। এটি সংজ্ঞায়িত করার পরে, আমরা সাথে কাজ করতে পারি [D True, D "abc", D 42] :: [D Show]
সেন্ট্রিল

8

মরিচাটির "বৈশিষ্ট্যগুলি" হাস্কেলের ধরণের শ্রেণীর সাথে সাদৃশ্যপূর্ণ।

হাস্কেলের সাথে প্রধান পার্থক্য হ'ল বৈশিষ্ট্যগুলি কেবল বিন্দু চিহ্নিতকরণ সহ অভিব্যক্তির জন্য হস্তক্ষেপ করে, অর্থাত্ a.foo (খ) ফর্মটি।

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


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