হাস্কেলের `ডেটা` এবং` নতুন টাইপের মধ্যে পার্থক্য


191

আমি এই লিখতে পার্থক্য কি?

data Book = Book Int Int

বনাম

newtype Book = Book (Int, Int) -- "Book Int Int" is syntactically invalid

আপনার আশেপাশে কিছু অনুসন্ধান করা উচিত, এই প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে। stackoverflow.com/questions/2649305/...
tehman


এছাড়াও সম্পর্কিত: নতুন প্রকারের
ডন স্টুয়ার্ট

25
নোট যে newtype Book = Book Int Intবৈধ নয়। তবে, আপনি newtype Book = Book (Int, Int)নীচে dons দ্বারা উল্লিখিত থাকতে পারে ।
এডওয়ার্ড কেএমইটিটি

উত্তর:


241

দুর্দান্ত প্রশ্ন!

বেশ কয়েকটি মূল পার্থক্য রয়েছে।

প্রতিনিধিত্ব

  • একটি newtypeগ্যারান্টি দেয় যে রানটাইমের সময় আপনার ডেটাতে হুবহু একই উপস্থাপনা থাকবে, আপনি যে ধরণের মোড়ক রাখেন তেমন।
  • dataরানটাইমের সময় একেবারে নতুন ডেটা কাঠামো ঘোষণা করে।

সুতরাং এখানে মূল বক্তব্যটি হ'ল newtypeকনক্রিটের সময়টি নির্মাণের জন্য মুছে ফেলার গ্যারান্টিযুক্ত।

উদাহরণ:

  • data Book = Book Int Int

উপাত্ত

  • newtype Book = Book (Int, Int)

নতুন ধরনের

উল্লেখ্য কিভাবে এটি হিসেবে ঠিক একই উপস্থাপনা করেছেন (Int,Int), যেহেতু Bookকন্সট্রাকটর মুছে ফেলা হয়।

  • data Book = Book (Int, Int)

তথ্য tuple

একটি অতিরিক্ত Bookনির্মাণকারী উপস্থিত নেই newtype

  • data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int

এখানে চিত্র বর্ণনা লিখুন

পয়েন্টার নেই! দুটি Intক্ষেত্রটি Bookকনস্ট্রাক্টরের শব্দের মাপের বাক্সহীন ক্ষেত্র ।

বীজগণিত তথ্য প্রকার

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

data Maybe a = Nothing
             | Just a

যেহেতু এটির একাধিক কনস্ট্রাক্টর রয়েছে। কিংবা লিখতেও পারছেন না

newtype Book = Book Int Int

কষাকষি

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

Bookটু (,)কনস্ট্রাক্টরের সেই অতিরিক্ত পয়েন্টারটি আমাদের নীচে মান রাখতে দেয়।

ফলস্বরূপ, newtypeএবং dataকিছুটা আলাদা কঠোরতা বৈশিষ্ট্য রয়েছে, যেমন হাস্কেল উইকির নিবন্ধে ব্যাখ্যা করা হয়েছে

আনবক্সিং

এটির কোনও উপাদানগুলি আনবক্স করার কোনও অর্থ নেই newtype, যেহেতু কোনও নির্মাণকারী নেই। যদিও এটি সম্পূর্ণরূপে লেখার পক্ষে যুক্তিযুক্ত:

data T = T {-# UNPACK #-}!Int

Tকনস্ট্রাক্টর এবং একটি Int#উপাদান সহ একটি রানটাইম অবজেক্ট উত্পাদন করে । আপনি কেবল Intসাথে খালি পেতে newtype


তথ্যসূত্র :


2
আমি এখনও মনে করি না যে হাস্কেলের কোনও "নতুন টাইপ" না থাকলে আমি কিছু মিস করব। সূক্ষ্ম পার্থক্য ভাষায় জটিলতা যুক্ত করে যা আমার কাছে কল্যাণকর বলে মনে হচ্ছে না ...
মার্টিংউ

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

দুর্দান্ত ব্যাখ্যা! আমি যা বুঝতে পারি না তা যদি newtypeসংকলনের পরে মুছে ফেলা হয় এবং রানটাইম পুরানো এবং নতুন ধরণের জন্য একই উপস্থাপনা ব্যবহার করে, তবে আমরা কীভাবে এখনও পুরানো এবং নতুন উভয় প্রকারের উদাহরণগুলি সংজ্ঞায়িত করতে সক্ষম হতে পারি? রানটাইম কীভাবে বুঝতে পারে কোন উদাহরণটি ব্যবহার করতে হবে?
দামালুয়ার

3
@ দামলুয়ার সমস্ত প্রকার রানটাইমের সময় মুছে ফেলা হয়, সংকলনের সময় সেগুলি পুরোপুরি সমাধান করা হয় এবং সংকলনের সময় newtypeস্পষ্টতই এখনও মুছে ফেলা হয় না।
সেমিকোলন

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