দুর্দান্ত প্রশ্ন!
বেশ কয়েকটি মূল পার্থক্য রয়েছে।
প্রতিনিধিত্ব
- একটি
newtype
গ্যারান্টি দেয় যে রানটাইমের সময় আপনার ডেটাতে হুবহু একই উপস্থাপনা থাকবে, আপনি যে ধরণের মোড়ক রাখেন তেমন।
data
রানটাইমের সময় একেবারে নতুন ডেটা কাঠামো ঘোষণা করে।
সুতরাং এখানে মূল বক্তব্যটি হ'ল newtype
কনক্রিটের সময়টি নির্মাণের জন্য মুছে ফেলার গ্যারান্টিযুক্ত।
উদাহরণ:
newtype Book = Book (Int, Int)
উল্লেখ্য কিভাবে এটি হিসেবে ঠিক একই উপস্থাপনা করেছেন (Int,Int)
, যেহেতু Book
কন্সট্রাকটর মুছে ফেলা হয়।
data Book = Book (Int, Int)
একটি অতিরিক্ত 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
।
তথ্যসূত্র :