প্রকারগুলি কি হ্যাসকেলে মুছে ফেলা হয়?


13

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

ওস ক্যামলে যেমন হ্যাসকেলে প্রকারগুলি মুছে ফেলা হয়? যদি হ্যাঁ, হাস্কেলের "জেনেরিক ফাংশনগুলি" বাস্তবায়ন কীভাবে সাধারণ লিস্পের থেকে পৃথক হয়, যেখানে প্রকারগুলি গতিশীল এবং এইভাবে মুছে ফেলা হয় না?

আমি বুঝতে পারি যে বাস্তবায়নের বিশদগুলি সংকলক নির্দিষ্ট, তবে সম্ভবত অনেক বা সমস্ত বাস্তবায়নের ক্ষেত্রে সাধারণ ব্যবস্থা রয়েছে।


5
মনে রাখবেন আপনি সম্ভবত একটি তুচ্ছ তুচ্ছ ফাংশন সংজ্ঞায়িত করতে পারবেন না a -> String। আপনার মতো ধরণের বাধা থাকতে পারে Show a => a -> String
ডিজেজি

উত্তর:


16

উত্তর এখনও পর্যন্ত বিভ্রান্তিমূলক।

"প্যারামেট্রিক" এবং "অ্যাড-হক ওভারলোডিং" পলিমারফিজমের মধ্যে একটি পার্থক্য করা দরকার needs প্যারামেট্রিকের অর্থ "সমস্ত ধরণের জন্য সমানভাবে আচরণ করে একটি", যেখানে "অ্যাড-হক" - সাইমন পলিমারফিক হিসাবে উল্লেখ করেন - প্রকারের ভিত্তিতে বাস্তবায়ন পরিবর্তন করে।

উভয়ের উদাহরণ reverse :: [a] -> [a]হ'ল, যা প্যারাম্যাট্রিক এবং show :: Show a => a -> Stringযা "অ্যাড-হক" ওভারলোড হয়েছে।

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

উভয়ই সংকলন-সময়ে সমাধান করা হয়, এবং আসলে "মুছে ফেলা"। মডিউলো বিভিন্ন GHC এক্সটেনশন এবং টেমপ্লেট Haskell, ইত্যাদি প্রকারভেদ হয় আসলে কম্পাইল সময়ে মুছে ফেলা এবং রান সময়মত পরিদর্শন না।

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

টাইপ-ক্লাসে এসপিজে পাঠ্যপুস্তক এবং ওয়াডলার এবং ব্লটস পেপারে প্রয়োগটি বিশদভাবে রয়েছে ।


আপনি কি আমার উত্তর মুছে ফেলা উচিত বলে মনে করেন?
সাইমন বার্গোট

না, সঠিক শব্দভাণ্ডার না মারার আপনার সতর্কতার সাথে এটি ঠিক আছে:)
ক্রিস

জিএইচসি দ্বারা প্রকারগুলি মুছা সম্ভব কেন এটি আপনি কিছুটা প্রসারিত করতে পারেন? এটি কি মূল টাইপিংয়ের জন্য ধন্যবাদ?
সাইমন বার্গোট

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

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

1

সতর্কতা: সিএসে আমার ব্যাকগ্রাউন্ড খুব শক্তিশালী নয়, তাই আমি সর্বদা সঠিক শব্দভাণ্ডারটি ব্যবহার না করতে পারি এবং কিছু পয়েন্টে আমার ভুল হতে পারে। যাইহোক, এখানে আমার বোঝার বিষয়:

আমি মনে করি আপনি জেনেরিকগুলি বহুবচন দিয়ে বিভ্রান্ত করছেন।

জেনেরিক ধরণের List<Foo>যেমন প্যারামিটার হিসাবে অন্য ধরণের গ্রহণ করে এবং আরও ধরণের ধরণের পরীক্ষার অনুমতি দেয় এমন ধরণের বর্ণনা দিতে ব্যবহৃত হয়।

হ্যাসেলের একটি জেনেরিক ফাংশন হতে পারে count:: List a -> Int। এটি যে কোনও ধরণের তালিকা গ্রহণ করে এবং উপাদানগুলির সংখ্যা প্রদান করে। কেবলমাত্র একটি বাস্তবায়ন আছে।

সাধারণত, তালিকাটি সংজ্ঞায়িত করার সময়, আপনি টি সম্পর্কে কিছু অনুমান করতে পারবেন না You আপনি কেবল এটি সঞ্চয় করতে এবং এটি আবার দিতে পারেন।

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

আপনার একটি Showটাইপক্লাস রয়েছে, যা একটি show :: a -> Stringফাংশন সংজ্ঞায়িত করে।

যখন কোনও টাইপ টাইপক্লাস Fooপ্রয়োগ করে Show, এটি অবশ্যই সংজ্ঞা প্রদান করে show। এই ধরণেরটি তখন যোগ্যতার Show(যেমন হিসাবে Show a => a -> whatever) প্রয়োজনীয় ফাংশনে ব্যবহৃত হতে পারে । হাস্কেল প্রকারগুলি মুছতে পারে না, যেহেতু এই ফাংশনগুলিকে ফাংশনের সঠিক বাস্তবায়ন খুঁজে পেতে showহবে।


সাধারণ লিস্পে, পলিমারফিক ফাংশনগুলিকে "জেনেরিক ফাংশন" আইআইআরসি বলা হয় এবং আমি একই (বিভ্রান্তিকর) শব্দভাণ্ডার ব্যবহার করি। আপনার উত্তর দরকারী এবং আপনার চূড়ান্ত যুক্তি বেশ দৃinc়প্রত্যয়ী। .-)
ব্যবহারকারীর 40989

"কেবলমাত্র একটি বাস্তবায়ন রয়েছে" কেবলমাত্র এটিই বোধগম্য, নিশ্চিত, তবে অসীম সম্ভাবনা রয়েছে অনেকগুলি। টাইপ a → b এর একটি ফাংশন | b |। | A | সম্ভাব্য বাস্তবায়ন (টাইপ বুল → বুলের ফাংশনগুলির সংখ্যা বিবেচনা করুন) এবং তালিকাগুলির উপরের আকারের সীমা নেই।
জন পুরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.