কেন হাস্কেল মনোমরফিজম সীমাবদ্ধতা ছাড়া বারবার মূল্যায়ন এড়াতে অক্ষম?


14

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

আমার মনে রাখা সুনির্দিষ্ট উদাহরণটি উইকির দ্বারা ব্যবহৃত:

f xs = (len,len)
  where
    len = genericLength xs

যেখানে genericLengthটাইপ হয় Num a => [b] -> a

স্পষ্টতই, genericLength xsএকবার মূল্যায়নের জন্য একবার গণনা করা দরকার (len,len), কারণ এটি একই যুক্তিযুক্ত একই ফাংশন। এবং এটি জানতে আমাদের কোনও অনুরোধ দেখার দরকার নেই fসুতরাং কেন এমএসের মতো কোনও নিয়ম চালু না করে হাস্কেল এই অপ্টিমাইজেশনটি করতে পারবেন না?

উইকির পৃষ্ঠায় আলোচিত আলোচনার ফলে আমাকে জানানো হয় যে এটি Numএকটি কংক্রিটের চেয়ে টাইপক্লাসের সত্যিকারের সাথে কিছু করার আছে , তবে তবুও, সংকলন-সময় এটি স্পষ্ট হওয়া উচিত নয় যে খাঁটি ফাংশন একই মানটি ফিরিয়ে দেবে- -আর এইভাবে একই ধরণের কংক্রিটের ধরণ - একই যুক্তি দু'বার দেওয়া হলে?

উত্তর:


11

এটি একই আর্গুমেন্ট সহ একই ফাংশনটির নাম, তবে সম্ভাব্য ভিন্ন ভিন্ন রিটার্নের ধরণ এবং বাস্তবায়ন, কারণ এটি বহুত্বপূর্ণ। এর মানে হল যে যদি এটি একটি প্রসঙ্গ একটি আশা মধ্যে বলা হচ্ছে (Int, MyWeirdCustomNumType)রিটার্ন টাইপ, এটি দুইবার এটা নির্ণয় করা বাস্তবায়নের কারণ রয়েছে (+)যে Intবাস্তবায়ন থেকে সম্পূর্ণ ভিন্ন (+)মধ্যে MyWeirdCustomNumType। আপনার কোনও সময়ে শারীরিকভাবে আলাদা কোড চালানো দরকার।

এ কারণেই এটি গুরুত্বপূর্ণ যে Numএকটি টাইপ শ্রেণি। এর অর্থ আপনার কাছে বিভিন্ন ধরণের বিভিন্ন প্রয়োগ রয়েছে। এর অর্থ fএটি যদি কোনও লাইব্রেরিতে থাকে তবে এটি যে ধরণের ফেরতের দরকার হতে পারে তার সমস্ত সংমিশ্রণগুলি সম্পর্কে সংকলনের সময় এটি জানে না।

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


আমি সম্ভাবনা বিবেচনা করা হয়নি f [] :: (Int, Float)। এখন এটি নিখুঁত জ্ঞান করে তোলে। ধন্যবাদ.
Ixrec 21

1
It's the same function name, with the same arguments, but potentially different return types and implementations, because it's polymorphic.আমি মনে করি এটি দেখার আরও ভাল উপায়টি হ'ল টাইপক্লাস উদাহরণটি কার্যকরভাবে একটি অতিরিক্ত যুক্তি genericLengthএবং সংকলক উভয় কলগুলিতে একই আর্গুমেন্টের সাথে বিশ্বাস করে না।
ডোভাল

দ্রুত দিকের প্রশ্ন। যদি মনোমরফিজমস্ট্রিস্টেশনটি বন্ধ করে দেওয়া হয় তবে পরে আপনি এর মতো কিছু করেছিলেন যা a = uncurry (==) $ f [1, 2, 3]কেবলমাত্র [1, 2, 3]একবারের দৈর্ঘ্য পরীক্ষা করতে সেই কল সাইটটি অনুকূলিত করতে সক্ষম হবে ? যদি তাই হয় তবে আমি সত্যই বিভ্রান্ত হয়ে পড়েছি যে মনোমরফিজম সীমাবদ্ধতা আসলে আপনাকে কিনছে, তা না হলে কেন নয়?
সেমিকোলন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.