হাস্কেলের একটি ফাংশন a -> () মূল্যায়ন করা সম্পর্কে কী নিয়ম রয়েছে?


12

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

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হাসকেলে এটি মোনাড ব্যবহার করে আরও ভালভাবে পরিচালনা করা হয় , তাই আমি এটি সেভাবে অনুলিপি করেছিলাম, তবে তাত্ত্বিক সমস্যা হিসাবে প্রশ্ন থেকেই যায়। সমস্ত ইনপুট এবং জবাবের জন্য ধন্যবাদ।


1
এটি কর্মক্ষেত্রে অলসতা। কোনও ফাংশনের ফলাফল দাবি না করা (উদাহরণস্বরূপ কোনও কনস্ট্রাক্টরের সাথে প্যাটার্ন ম্যাচিংয়ের মাধ্যমে), ফাংশনটির শরীরের মূল্যায়ন করা হয় না। পার্থক্যটি পর্যবেক্ষণ করতে, তুলনা করার চেষ্টা করুন h1::()->() ; h1 () = ()এবং h2::()->() ; h2 _ = ()। উভয় চালান h1 (f 1)এবং h2 (f 1), এবং দেখুন যে শুধুমাত্র প্রথম এক দাবী (f 1)
চি

1
"অলসতা বলে মনে হচ্ছে যে কোনও ধরণের মূল্যায়ন না হয়ে এটি () দিয়ে প্রতিস্থাপিত হয়।" ওটার মানে কি? সব ক্ষেত্রে f 1"প্রতিস্থাপন" করা undefinedহয়।
oisdk

3
একটি ফাংশন ... -> ()1) সমাপ্তি এবং ফিরে আসতে পারে (), 2) একটি ব্যতিক্রম / রানটাইম ত্রুটি সহ বন্ধ করতে পারে এবং কিছু ফেরত দিতে ব্যর্থ হয়, বা 3) ডাইভার্জ (অসীম পুনরাবৃত্তি)। জিএইচসি কোডটিকে কেবলমাত্র 1 টি অনুমান করেই অনুকূলিত করে না) ঘটতে পারে: যদি f 1দাবি করা হয়, তবে এটি তার মূল্যায়ন এবং ফিরে এড়ায় না ()। হাস্কেল শব্দার্থক এটির মূল্যায়ন এবং 1,2,3 এর মধ্যে কী ঘটে তা দেখার জন্য।
চি

2
()এই প্রশ্নে ( বিশেষত প্রকার বা মান) সম্পর্কে বিশেষ কিছু নেই । আপনি একই জায়গায় সমস্ত জায়গায় পর্যালোচনাগুলি () :: ()বলুন, প্রতিস্থাপন করুন 0 :: Int। এগুলি সবই অলস মূল্যায়নের পুরানো পরিণতি b
ড্যানিয়েল ওয়াগনার

2
না, "এড়ানো" ইত্যাদি হাস্কেল শব্দার্থক শব্দ নয়। এবং প্রকারের দুটি সম্ভাব্য মান রয়েছে এবং । ()()undefined
নেস

উত্তর:


10

আপনি এই ধরণের ()একটি মাত্র সম্ভাব্য মান আছে এমন ধারণা থেকে উপস্থিত হয়ে উপস্থিত হন ()এবং সুতরাং প্রত্যাশা করেন যে কোনও ফাংশন কল প্রকারের মান প্রত্যাবর্তন করে ()স্বয়ংক্রিয়ভাবে মানটি নির্ধারণ করে নেওয়া উচিত ()

হাস্কেল এইভাবে কাজ করে না। প্রতিটি ধরণের হ্যাসকেলে আরও একটি মান রয়েছে, যথা দ্বারা কোনও মান, ত্রুটি বা তথাকথিত "নীচে" নয়, এনকোডযুক্ত undefined। সুতরাং একটি মূল্যায়ন আসলে ঘটছে:

main = print (f 1)

কোর ভাষার ভাষার সমতুল্য

main = _Case (f 1) _Of x -> print x   -- pseudocode illustration

বা এমনকি (*)

main = _Case (f 1) _Of x -> putStr "()"

এবং কোর এর _Caseহয় অত্যাচার :

"একটি %case[এক্সপ্রেশন] মূল্যায়ন পরীক্ষার জন্য অভিব্যক্তির মূল্যায়নের জন্য বাধ্যতামূলক করে (" স্ক্রুটিনি ")। স্ক্রুটিনিটির মান মূলশব্দটি অনুসরণ করে চলকের সাথে আবদ্ধ %of, ..."।

মান দুর্বল মাথা স্বাভাবিক ফর্ম করতে বাধ্য করা হয়। এটি ভাষার সংজ্ঞার অংশ।

Haskell, হয় না একটি ঘোষণামূলক প্রোগ্রামিং ভাষা।


(*) print x = putStr (show x) এবং show () = "()"তাই showকলটি পুরোপুরি সংকলন করা যায়।

মানটি প্রকৃতপক্ষে হিসাবে আগে থেকেই পরিচিত (), এবং এমনকি এর মান show ()হিসাবে অগ্রিম পরিচিত "()"। তবুও স্বীকৃত হাস্কেল শব্দার্থবিজ্ঞানের দাবি যে (f 1)অগ্রিম স্ট্রিংয়ে প্রিন্ট করার আগে , এর মান হ'ল স্বাভাবিক ফর্মকে দুর্বল করতে বাধ্য হয় "()",।


সম্পাদনা: বিবেচনা করুন concat (repeat [])। এটি হওয়া []উচিত, না এটি অসীম লুপ হওয়া উচিত?

একটি "ঘোষিত ভাষা" এর উত্তর সম্ভবত এটি []। হাস্কেলের উত্তর, অসীম লুপ

অলসতা হ'ল "দরিদ্র মানুষের ঘোষণামূলক প্রোগ্রামিং", তবে এটি এখনও আসল জিনিস নয়

সম্পাদনা 2 : print $ h (f 1) == _Case (h (f 1)) _Of () -> print ()এবং কেবল hবাধ্য করা হয়, নয় f; এবং এর উত্তর উত্পন্ন hকরতে তার সংজ্ঞা অনুযায়ী কিছু জোর করতে হবে না h _ = ()

বিভাজনমূলক মন্তব্য: অলসতায় রাইসন ডি'তেরে থাকতে পারে তবে এটি এর সংজ্ঞা নয়। অলসতা যা তা। এটি সমস্ত মান হিসাবে প্রাথমিকভাবে থাঙ্কস হিসাবে সংজ্ঞায়িত করা হয়েছে যা ডাব্লুএইচএনএফ থেকে বাধ্যতামূলকভাবে আসা চাহিদা অনুসারে বাধ্য হয় main। এটি যদি তার নির্দিষ্ট পরিস্থিতি অনুসারে নির্দিষ্ট নির্দিষ্ট ক্ষেত্রে নীচে এড়াতে সহায়তা করে তবে তা তা করে। যদি না হয়, না। এটাই সব।

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


প্রতিবেদনে যাচ্ছি , আমাদের আছে

f :: a -> ()
f = \_ -> (undefined :: ())

তারপর

print (f 1)
 = print ((\ _ ->  undefined :: ()) 1)
 = print          (undefined :: ())
 = putStrLn (show (undefined :: ()))

এবং সাথে

instance Show () where
    show :: () -> String
    show x = case x of () -> "()"

এটা অবিরত

 = putStrLn (case (undefined :: ()) of () -> "()")

এখন, বিভাগটির 3.17.3 প্যাটার্ন ম্যাচিংয়ের প্রতিবেদনটির আনুষ্ঠানিক শব্দার্থতত্ত্ব বলছে

caseচিত্রসমূহে শব্দার্থের শব্দার্থবিদ্যা [দেওয়া হয়েছে] ৩.১-৩.৩। যে কোনও বাস্তবায়ন এমন আচরণ করা উচিত যাতে এই পরিচয়গুলি [...] ধরে থাকে।

এবং কেস (r)মধ্যে চিত্র 3.2 রাজ্যের

(r)     case  of { K x1  xn -> e; _ -> e } =  
        where K is a data constructor of arity n 

() আরটি 0 এর ডেটা কনস্ট্রাক্টর, সুতরাং এটির মতোই

(r)     case  of { () -> e; _ -> e } =  

এবং মূল্যায়নের সামগ্রিক ফলাফল এইভাবে হয়


2
আমি আপনার ব্যাখ্যা পছন্দ। এটা পরিষ্কার এবং সহজ।
প্রচারিত

@ ড্যানিয়েল ওয়াগনার আমার কাছে caseকোর থেকে আসলে মনে ছিল এবং ফাঁক গর্তটিকে উপেক্ষা করছি ignoring :) আমি কোর উল্লেখ করতে সম্পাদনা করেছি।
নেস

1
অত্যাচার করবে না হতে showদ্বারা প্রার্থনা print? এর মতো কিছুshow x = case x of () -> "()"
ব্যবহারকারী 253751

1
আমি caseকোরকে উল্লেখ করেছি , হাস্কেল নিজেই নয়। হাস্কেল কোরতে অনূদিত হয়েছে case, এটিএএফআইএকে জোর করে । আপনি সঠিক যে caseহাস্কেল নিজেই জোর করে নি। আমি স্কিম বা এমএল তে কিছু লিখতে পারি (যদি আমি এমএল এটি লিখতে পারি), বা সিউডোকোডে।
নেস

1
এই সমস্তটির অনুমোদনমূলক উত্তর সম্ভবত প্রতিবেদনের কোথাও রয়েছে। আমি কেবল জানি এখানে কোনও "অপ্টিমাইজেশন" চলছে না, এবং "নিয়মিত মান" এই প্রসঙ্গে একটি অর্থবোধক শব্দ নয়। যাই হোক না কেন, জোর করে। printমুদ্রণের জন্য যতটা প্রয়োজন জোর করে। এটি প্রকারটি দেখে না, প্রকারগুলি চলে যায়, মুছে ফেলা হয়, প্রোগ্রামটি চলার সময়, সঠিক মুদ্রণ সাবরুটাইন ইতিমধ্যে সংকলনের সময় টাইপ অনুযায়ী বেছে নেওয়া হয়েছে এবং সংকলিত হয়েছে; সাবরুটাইন এখনও চালনার সময়ে তার ইনপুট মানটিকে জোর করে ডাব্লুএইচএএনএফের কাছে চাপিয়ে দিতে চলেছে, এবং যদি এটি অপরিবর্তিত থাকে তবে এটি একটি ত্রুটির কারণ ঘটবে।
নেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.