অস্তিত্বমূলক প্রকারগুলি কার্যকরী প্রোগ্রামিংয়ে খারাপ অভ্যাস হিসাবে বিবেচিত হয় না। আমি মনে করি আপনাকে কী ট্রিপ করছে তা হ'ল অস্তিত্বের জন্য সর্বাধিক উল্লেখযোগ্য ব্যবহার হ'ল অস্তিত্বের টাইপক্লাস অ্যান্টিপ্যাটার্ন , যা অনেকে বিশ্বাস করেন যে এটি খারাপ অভ্যাস।
এই ধরণটি প্রায়শই বিজাতীয়ভাবে টাইপ করা উপাদানের একটি তালিকা থাকা উচিত যা সমস্ত একই টাইপক্লাস প্রয়োগ করে। উদাহরণস্বরূপ, Show
উদাহরণগুলির সাথে মানগুলির একটি তালিকা থাকতে পারে :
{-# LANGUAGE ExistentialTypes #-}
class Shape s where
area :: s -> Double
newtype Circle = Circle { radius :: Double }
instance Shape Circle where
area (Circle r) = pi * r^2
newtype Square = Square { side :: Double }
area (Square s) = s^2
data AnyShape = forall x. Shape x => AnyShape x
instance Shape AnyShape where
area (AnyShape x) = area x
example :: [AnyShape]
example = [AnyShape (Circle 1.0), AnyShape (Square 1.0)]
এর মতো কোডের সমস্যাটি হ'ল:
- আপনি কেবলমাত্র কার্যকর ক্রিয়াকলাপটি করতে পারেন
AnyShape
তার অঞ্চলটি পাওয়া।
AnyShape
আকারের আকারগুলির মধ্যে একটি আনতে আপনাকে এখনও কনস্ট্রাক্টর ব্যবহার করতে হবে AnyShape
।
দেখা যাচ্ছে যে, এই টুকরোটি কোডটি আপনাকে এমন কিছু দেয় না যা এই ছোট্টটি দেয় না:
class Shape s where
area :: s -> Double
newtype Circle = Circle { radius :: Double }
instance Shape Circle where
area (Circle r) = pi * r^2
newtype Square = Square { side :: Double }
area (Square s) = s^2
example :: [Double]
example = [area (Circle 1.0), area (Square 1.0)]
মাল্টি-মেথড ক্লাসগুলির ক্ষেত্রে, একই পদ্ধতি সাধারণত "পদ্ধতিগুলির রেকর্ড" এনকোডিং ব্যবহার করে আরও সহজভাবে সম্পাদন করা যায় like টাইপক্লাসের মতো ব্যবহারের পরিবর্তে Shape
, আপনি একটি রেকর্ড টাইপ সংজ্ঞায়িত করেন যার ক্ষেত্রগুলি "পদ্ধতির" Shape
ধরণের হয় , এবং আপনি আপনার চেনাশোনা এবং স্কোয়ারগুলিকে এসগুলিতে রূপান্তর করতে ফাংশন লিখেন Shape
।
তবে এর অর্থ এই নয় যে অস্তিত্বের ধরণগুলি একটি সমস্যা! উদাহরণস্বরূপ, মরিচে তাদের বৈশিষ্ট্যযুক্ত বস্তু নামে একটি বৈশিষ্ট্য রয়েছে যা লোকেরা প্রায়শই একটি বৈশিষ্ট্যের উপরে অস্তিত্বের ধরণ হিসাবে বর্ণনা করে (মরিচের ধরণের সংস্করণের সংস্করণ)। যদি অস্তিত্বের টাইপক্লাসগুলি হাস্কেলের একটি অ্যান্টিপ্যাটার্ন হয়, তার মানে কি এই যে মরিচা একটি খারাপ সমাধান বেছে নিয়েছে? না! হাস্কেল বিশ্বে প্রেরণা মূলত নীতি সম্পর্কে নয়, বাক্য গঠন এবং সুবিধার্থে।
এই নির্বাণ একটি আরো গাণিতিক পথ নির্দেশ করা হয় যে AnyShape
উপরে এবং থেকে টাইপ Double
হয় isomorphic কিছু আছে তাদের মধ্যে একটি "অবচয়হীন রূপান্তর" (ভাল, পয়েন্ট স্পষ্টতা ভাসমান জন্য সংরক্ষণ করুন) হল:
forward :: AnyShape -> Double
forward = area
backward :: Double -> AnyShape
backward x = AnyShape (Square (sqrt x))
তাই কড়া কথায় বলতে গেলে, আপনি একটি অন্যটি বনাম চয়ন করে কোনও শক্তি অর্জন বা হারাচ্ছেন না। যার অর্থ পছন্দটি ব্যবহারের সহজতা বা পারফরম্যান্সের মতো অন্যান্য কারণের ভিত্তিতে হওয়া উচিত।
এবং মনে রাখবেন যে অস্তিত্বমূলক ধরণেরগুলির এই ভিন্নধর্মী তালিকার উদাহরণগুলির বাইরে অন্যান্য ব্যবহার রয়েছে, সুতরাং সেগুলি রাখা ভাল। উদাহরণস্বরূপ, হাস্কেলের ST
ধরণ যা আমাদের বাহ্যিকভাবে খাঁটি তবে অভ্যন্তরীণভাবে মেমরি মিউটেশন অপারেশন ব্যবহার করতে পারে এমন ফাংশন লিখতে দেয়, সংকলন-সময়ে সুরক্ষার গ্যারান্টি দেওয়ার জন্য অস্তিত্বের ধরণের উপর ভিত্তি করে একটি কৌশল ব্যবহার করে।
সুতরাং সাধারণ উত্তরটি হ'ল কোনও সাধারণ উত্তর নেই। অস্তিত্বমূলক প্রকারের ব্যবহারগুলি কেবলমাত্র প্রসঙ্গে বিচার করা যেতে পারে different এবং বিভিন্ন ভাষায় কী বৈশিষ্ট্য এবং বাক্য গঠনটি সরবরাহ করা হয়েছে তার উপর নির্ভর করে উত্তরগুলি পৃথক হতে পারে।