ঠিক যেমন শিরোনামটি বলেছে: হাস্কেল ফাংশন রিটার্নিং ইউনিটের মূল্যায়ন করার জন্য কী গ্যারান্টি রয়েছে? কেউ ভাবেন যে এ জাতীয় ক্ষেত্রে কোনও ধরণের মূল্যায়ন চালানোর দরকার নেই, সংকলক এই জাতীয় কলগুলিকে তাত্ক্ষণিক ()
মান দিয়ে প্রতিস্থাপন করতে পারে যদি না কঠোরতার জন্য সুস্পষ্ট অনুরোধ উপস্থিত না হয়, সেক্ষেত্রে কোডটি সিদ্ধান্ত নিতে পারে যে এটি করা উচিত কিনা ফিরে ()
বা নীচে
আমি জিএইচসিআইতে এটি নিয়ে পরীক্ষা-নিরীক্ষা করেছি এবং দেখে মনে হচ্ছে এর বিপরীত ঘটনাটি ঘটে, অর্থাত্ এই জাতীয় ফাংশনটি মূল্যায়ন করা বলে মনে হয়। খুব আদিম উদাহরণ হবে
f :: a -> ()
f _ = undefined
মূল্যায়ণ f 1
উপস্থিতির কারণে একটি ত্রুটি ছুড়ে ফেলে undefined
তাই কিছু মূল্যায়ন অবশ্যই ঘটে। মূল্যায়ন কত গভীরতর হয় এটি স্পষ্ট নয়; কখনও কখনও এটি ফাংশনগুলিতে সমস্ত কলগুলির মূল্যায়ন করা যতটা গভীর হয় তেমন গভীরভাবে প্রদর্শিত হয় ()
। উদাহরণ:
g :: [a] -> ()
g [] = ()
g (_:xs) = g xs
যদি এই কোডটি উপস্থাপন করা হয় তবে অনির্দিষ্টকালের জন্য লুপ হয় g (let x = 1:x in x)
। কিন্তু তারপর
f :: a -> ()
f _ = undefined
h :: a -> ()
h _ = ()
এই h (f 1)
রিটার্নগুলি দেখানোর জন্য ব্যবহার করা যেতে পারে ()
, সুতরাং এক্ষেত্রে সমস্ত ইউনিট-মূল্যবান subexpressions মূল্যায়ন করা হয় না। এখানে সাধারণ নিয়ম কী?
ইটিএ: অবশ্যই আমি আলস্যতা সম্পর্কে জানি। আমি জিজ্ঞাসা করছি যে সংকলক লেখকদের এই বিশেষ কেসটি সাধারণত সম্ভবের চেয়েও বেশি অলস করতে বাধা দেয়।
ETA2: উদাহরণগুলির সংক্ষিপ্তসার: জিএইচসি ()
অন্য যে কোনও ধরণের হিসাবে হুবহু আচরণ করবে বলে মনে হচ্ছে, যেমন কোনও ধরণের নিয়মিত মানটি কোন ফাংশন থেকে ফিরিয়ে আনতে হবে এমন কোনও প্রশ্ন রয়েছে was এই ধরণের একটি মাত্র মান রয়েছে তা অপটিমাইজেশন অ্যালগরিদম দ্বারা ব্যবহৃত হয়নি (আব) by
ETA3: আমি যখন হাস্কেল বলি, তখন আমি হ্যাস্কেল-হিসাবে-সংজ্ঞায়িত-দ্বারা-প্রতিবেদনটি বুঝি, হাসেল-দ্য-এইচ-ইন-জিএইচসি নয়। আমার ধারণা হিসাবে ব্যাপকভাবে ভাগ করা হয়নি এমন একটি ধারণা বলে মনে হচ্ছে (যা 'পাঠকদের 100% দ্বারা'), অথবা আমি সম্ভবত একটি পরিষ্কার প্রশ্ন তৈরি করতে সক্ষম হয়েছি। তবুও, আমি প্রশ্নের শিরোনাম পরিবর্তনের জন্য আফসোস করছি, কারণ এটি প্রাথমিকভাবে জিজ্ঞাসা করেছিল যে এই জাতীয় ফাংশন ডাকা হওয়ার জন্য সেখানে কী গ্যারান্টি রয়েছে।
ETA4: দেখে মনে হবে যে এই প্রশ্নটি তার গতিপথটি চালিয়েছে, এবং আমি এটিকে উত্তর না দিয়ে বিবেচনা করছি। (আমি একটি 'নিকট প্রশ্ন' ফাংশন সন্ধান করছিলাম তবে কেবল 'নিজের নিজের প্রশ্নের উত্তর' পেয়েছি এবং এর উত্তর দেওয়া যায় না বলে আমি সেই পথে নামি না)) প্রতিবেদন থেকে কেউই এমন কোনও সিদ্ধান্ত নিয়ে আসেনি যা উভয় দিক থেকেই সিদ্ধান্ত নেবে , যা আমি একটি শক্তিশালী তবে নির্দিষ্ট নয় যেমন 'ভাষার জন্য কোনও গ্যারান্টি' উত্তর হিসাবে ব্যাখ্যা করতে প্ররোচিত হই। আমরা কেবল জানি এটি হ'ল বর্তমান জিএইচসি বাস্তবায়ন এ জাতীয় ফাংশনের মূল্যায়ন এড়াতে পারবে না।
হাস্কেলকে ওসিএএমএল অ্যাপ্লিকেশন পোর্ট করার সময় আমি আসল সমস্যায় পড়েছি। মূল অ্যাপ্লিকেশনটিতে অনেক ধরণের পারস্পরিক পুনরাবৃত্তিমূলক কাঠামো ছিল এবং কোডটি assert_structureN_is_correct
এন 1. এর জন্য 1.6 বা 7 তে ডাকা বিভিন্ন সংখ্যক ফাংশন ঘোষণা করেছিল , যার প্রতিটিই কাঠামোটি সঠিক ছিল কিনা তা ইউনিট ফিরিয়েছিল এবং এটি না হলে ব্যতিক্রম ছুঁড়ে ফেলেছে । এছাড়াও, এই ফাংশনগুলি একে অপরকে ডেকেছিল কারণ তারা যথার্থতার শর্তটি পচে গেছে। Either String
হাসকেলে এটি মোনাড ব্যবহার করে আরও ভালভাবে পরিচালনা করা হয় , তাই আমি এটি সেভাবে অনুলিপি করেছিলাম, তবে তাত্ত্বিক সমস্যা হিসাবে প্রশ্ন থেকেই যায়। সমস্ত ইনপুট এবং জবাবের জন্য ধন্যবাদ।
f 1
"প্রতিস্থাপন" করা undefined
হয়।
... -> ()
1) সমাপ্তি এবং ফিরে আসতে পারে ()
, 2) একটি ব্যতিক্রম / রানটাইম ত্রুটি সহ বন্ধ করতে পারে এবং কিছু ফেরত দিতে ব্যর্থ হয়, বা 3) ডাইভার্জ (অসীম পুনরাবৃত্তি)। জিএইচসি কোডটিকে কেবলমাত্র 1 টি অনুমান করেই অনুকূলিত করে না) ঘটতে পারে: যদি f 1
দাবি করা হয়, তবে এটি তার মূল্যায়ন এবং ফিরে এড়ায় না ()
। হাস্কেল শব্দার্থক এটির মূল্যায়ন এবং 1,2,3 এর মধ্যে কী ঘটে তা দেখার জন্য।
()
এই প্রশ্নে ( বিশেষত প্রকার বা মান) সম্পর্কে বিশেষ কিছু নেই । আপনি একই জায়গায় সমস্ত জায়গায় পর্যালোচনাগুলি () :: ()
বলুন, প্রতিস্থাপন করুন 0 :: Int
। এগুলি সবই অলস মূল্যায়নের পুরানো পরিণতি b
()
()
undefined
h1::()->() ; h1 () = ()
এবংh2::()->() ; h2 _ = ()
। উভয় চালানh1 (f 1)
এবংh2 (f 1)
, এবং দেখুন যে শুধুমাত্র প্রথম এক দাবী(f 1)
।