হাস্কেলের কঠোরতা পয়েন্টগুলি কী কী?


90

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

হ্যাসকেলে হ্রাস (বা মূল্যায়ন) কেবলমাত্র কঠোরতার পয়েন্টে ঘটে।

কাজেই প্রশ্ন আসে সেই কি, অবিকল , Haskell, এর কষাকষি পয়েন্ট আছে? আমার অন্তর্নিহিততা বলছে যে main, seq/ ব্যাংকের নিদর্শন, প্যাটার্ন মিল এবং কোনও IOক্রিয়াকলাপই mainপ্রাথমিক কঠোরতা পয়েন্ট ness

(এছাড়াও, যদি তাদের "কষাকষি পয়েন্ট", বলা হয় না করছি কি হয় তাদের বলা?)

আমি কল্পনা করি একটি ভাল উত্তরের মধ্যে ডাব্লুএইচএনএফ ইত্যাদি সম্পর্কে কিছু আলোচনা অন্তর্ভুক্ত থাকবে। আমি এটি কল্পনাও করতে পারি যে এটি ল্যাম্বডা ক্যালকুলাসে স্পর্শ করবে।


সম্পাদনা করুন: এই প্রশ্ন সম্পর্কে অতিরিক্ত চিন্তা।

আমি এই প্রশ্নের প্রতিবিম্বিত হিসাবে, আমি মনে করি এটি একটি দৃness়তা বিন্দুর সংজ্ঞা কিছু যুক্ত করা আরও পরিষ্কার হবে। স্ট্রাইনেস পয়েন্টে ভিন্ন ভিন্ন প্রসঙ্গ এবং বিবিধ গভীরতা (বা কঠোরতা) থাকতে পারে। আমার সংজ্ঞাটির পিছনে পড়ে যে "হাস্কেলের হ্রাস কেবল কঠোরতা পয়েন্টগুলিতেই ঘটে", আসুন আমরা এই সংজ্ঞাটিকে এই ধারাটিতে যোগ করি: "তার চারপাশের প্রসঙ্গটি মূল্যায়ন বা হ্রাস করা হলেই একটি কঠোরতা বিন্দু ট্রিগার হয়।"

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

এখন আপনি চেষ্টা করুন: আলোচনা করুন seqএবং এই পদগুলিতে প্যাটার্ন মেলাচ্ছেন। ফাংশন প্রয়োগের সংক্ষিপ্তসারগুলি ব্যাখ্যা করুন: এটি কীভাবে কঠোর? কেমন হয় না? কি হবে deepseq? letএবং caseবিবৃতি? unsafePerformIO? Debug.Trace? শীর্ষ স্তরের সংজ্ঞা? কঠোর ডেটা টাইপ? ঠাট্টা নিদর্শন? ইত্যাদি। এই আইটেমগুলির মধ্যে কতটি কেবল সিক বা প্যাটার্ন মিলের ক্ষেত্রে বর্ণনা করা যায়?


10
আপনার স্বজ্ঞাত তালিকাটি সম্ভবত খুব অরগানীয় নয়। আমি সন্দেহ করি seqএবং প্যাটার্নের মিলগুলি যথেষ্ট, বাকীগুলির সাথে সংজ্ঞাযুক্ত with আমি মনে করি প্যাটার্ন মেলানো IOকাজগুলির মেরুদণ্ড-কঠোরতার নিশ্চয়তা দেয় ।
সিএ ম্যাকক্যান

যেমন প্রিমিটিভের, +উপর বিল্ট-ইন সাংখ্যিক ধরনের এছাড়াও কষাকষি বাধ্য, এবং আমি অনুমান একই বিশুদ্ধ FFI কল প্রযোজ্য।
হামার

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

@ ক্রিস্মস্মিত আমি এই দুটি ভিন্ন মামলা বিভ্রান্ত করার চেষ্টা করছি না; যদি তারা কিছু করে তবে আমি আরও স্পষ্টতা চাইব। কঠোরতা একরকম হয়, এবং উভয় ক্ষেত্রেই গুরুত্বপূর্ণ, যদিও আলাদা হয়, কঠোরতার অংশ "ঘটছে" " (এবং @ monadic: ಠ_ಠ)
ড্যান বার্টন

আপনি যদি পুরো প্রশ্নের উত্তর না দিয়েই এই প্রশ্নের দিকগুলি নিয়ে আলোচনা করার / ঘর প্রয়োজন চান তবে আমাকে এই প্রশ্নের জন্য আমার / আর / হ্যাসেল পোস্টে
ড্যান বার্টন

উত্তর:


46

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

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

সম্ভবত এই উত্তরটি আপনার কাছে কিছুটা বিমূর্ত বলে মনে হচ্ছে (আমি বিশেষত ব্যাংয়ের প্যাটার্নগুলি বা সিকিউরিটির উল্লেখ করিনি), তবে আপনি সুনির্দিষ্ট কিছু চেয়েছিলেন , এবং এটি আমরা যা করতে পারি তার সম্পর্কে সেরা।


18
আমি সবসময়ই এই মজার বিষয় খুঁজে পেয়েছি যে জিএইচসি "ডিজুগারিং" বলে, সিনট্যাকটিক চিনি অপসারণ করা হ্যাশকেল ভাষার নিজেই প্রকৃত বাক্য গঠন অন্তর্ভুক্ত করেছে ... বোঝা যাচ্ছে যে, জিএইচসি সত্যই জিএইচসির জন্য একটি অনুকূলিতকরণ সংকলক মূল ভাষা, যা ঘটনাক্রমে হ্যাস্কেলকে কোরে অনুবাদ করার জন্য খুব বিস্তৃত ফ্রন্ট-এন্ড অন্তর্ভুক্ত করে । :]
সিএ ম্যাকক্যান

টাইপ সিস্টেমগুলি যদিও স্পষ্টতই মাখছে না ... বিশেষত তবে কেবল টাইপক্লাসগুলি স্পষ্ট অভিধানে অনুবাদ করার ক্ষেত্রে নয়, যেমনটি আমি মনে করি। এবং সমস্ত সাম্প্রতিকতম টিএফ / জিএডিডি স্টাফ, যেমন আমি এটি বুঝতে পারি, সেই ব্যবধানটিকে আরও প্রশস্ত করে তুলেছে।
sclv

4
জিসিসি সি কেও
György Andrasek

20

আমি সম্ভবত এই প্রশ্নটি পুনরায় আবৃত্তি করব, হাস্কেল কোন পরিস্থিতিতে কোন অভিব্যক্তির মূল্যায়ন করবে? (সম্ভবত একটি "দুর্বল মাথা স্বাভাবিক ফর্ম।")

প্রথম অনুমানের জন্য, আমরা নিম্নলিখিত হিসাবে এটি নির্দিষ্ট করতে পারি:

  • আইও ক্রিয়াকলাপ সম্পাদন করা তাদের "প্রয়োজনীয়" যে কোনও মত প্রকাশের মূল্যায়ন করবে। (সুতরাং আইও ক্রিয়াটি কার্যকর করা হয়েছে কিনা তা আপনার জানতে হবে, উদাহরণস্বরূপ এটির নামটি মূল, অথবা এটি মূল থেকে আহ্বান করা হয়েছে এবং আপনাকে ক্রিয়াটির কী প্রয়োজন তা জানতে হবে))
  • একটি অভিব্যক্তি যা মূল্যায়ন করা হচ্ছে (আরে, এটি একটি পুনরাবৃত্ত সংজ্ঞা!) এটির যে কোনও মত প্রকাশের মূল্যায়ন করবে।

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

বিশেষভাবে সমস্ত বিবরণ দেওয়া একটি বৃহত কাজ, যেহেতু হাস্কেল একটি বৃহত ভাষা। এটিও বেশ সূক্ষ্ম, কারণ সমকালীন হাস্কেল জিনিসগুলি অনুমানমূলকভাবে মূল্যায়ন করতে পারে, যদিও আমরা শেষ পর্যন্ত ফলাফলটি ব্যবহার না করে: এটি তৃতীয় জাতের যা মূল্যায়ন করে। দ্বিতীয় বিভাগটি বেশ ভালভাবে অধ্যয়ন করা হয়েছে: আপনি জড়িত ক্রিয়াকলাপগুলির কঠোরতাটি দেখতে চান । প্রথম বিভাগটিও এক ধরণের "কঠোরতা" বলে মনে করা যেতে পারে, যদিও এটি কিছুটা ডজ্বি কারণ evaluate xএবং seq x $ return ()এটি আসলে ভিন্ন জিনিস! আপনি আইও মনাদকে কিছু ধরণের শব্দার্থবিজ্ঞান (স্পষ্টভাবে RealWorld#সরল কেসগুলির জন্য একটি টোকেন কাজ করে) দিলে আপনি এটি সঠিকভাবে চিকিত্সা করতে পারেন , তবে সাধারণভাবে এই স্তরযুক্ত কঠোরতা বিশ্লেষণের কোনও নাম আছে কিনা তা আমি জানি না।


17

সি এর সিকোয়েন্স পয়েন্টগুলির ধারণা রয়েছে যা নির্দিষ্ট ক্রিয়াকলাপের জন্য গ্যারান্টিযুক্ত যে এক অপরের অপরটির আগে মূল্যায়ন করা হবে। আমি মনে করি এটি নিকটতম বিদ্যমান ধারণা, তবে মূলত সমমানের মেয়াদী কঠোরতা বিন্দু (বা সম্ভবত ফোর্স পয়েন্ট ) হাস্কেল চিন্তার সাথে সামঞ্জস্যপূর্ণ।

অনুশীলনে হাস্কেল খাঁটি অলস ভাষা নয়: উদাহরণস্বরূপ প্যাটার্ন ম্যাচিং কঠোর (সুতরাং কোনও প্যাটার্ন ম্যাচের মূল্যায়ন চেষ্টা করে ম্যাচটি গ্রহণ বা প্রত্যাখ্যান করার পক্ষে কমপক্ষে যথেষ্ট পর্যায়ে যায়।

প্রোগ্রামাররা seqফলাফলটি কখনও ব্যবহৃত হবে কিনা তা বিবেচনা না করে মূল্যায়ন করতে কোনও অভিব্যক্তিকে বাধ্য করতে আদিম ব্যবহার করতে পারে।

$!শর্তে সংজ্ঞায়িত করা হয় seq

- অলস বনাম অ-কঠোর

সম্পর্কে আপনার চিন্তা সুতরাং !/ $!এবং seqমূলত ঠিক আছে, কিন্তু প্যাটার্ন ম্যাচিং subtler বিধি সাপেক্ষে হয়। আপনি অবশ্যই সর্বদা ~অলস প্যাটার্ন মেলানোর জন্য জোর করতে পারেন । একই নিবন্ধ থেকে একটি আকর্ষণীয় পয়েন্ট:

কঠোরতা বিশ্লেষক এমন ক্ষেত্রেও সন্ধান করে যেখানে বাহ্যিক অভিব্যক্তি দ্বারা সর্বদা সাব-এক্সপ্রেশন প্রয়োজন হয় এবং সেগুলি উত্সাহী মূল্যায়নে রূপান্তরিত করে। এটি এটি করতে পারে কারণ শব্দার্থবিজ্ঞান ("নীচে" শর্তাবলী) পরিবর্তন হয় না।

আসুন খরগোশের গর্তটি অবিরত রাখি এবং জিএইচসি দ্বারা সম্পাদিত অপটিমাইজেশনের জন্য দস্তাবেজগুলি দেখুন:

কঠোরতা বিশ্লেষণ এমন একটি প্রক্রিয়া যার মাধ্যমে জিএইচসি সংকলন-সময় নির্ধারণের চেষ্টা করে, কোন ডেটা অবশ্যই "সর্বদা প্রয়োজন" হবে। জিএইচসি তারপরে গণনাটি সংরক্ষণের জন্য এবং পরে এটি সম্পাদন করার জন্য স্বাভাবিক (উচ্চতর ওভারহেড) প্রক্রিয়া না করে কেবলমাত্র এই জাতীয় ডেটা গণনা করার জন্য কোড তৈরি করতে পারে।

- জিএইচসি অপ্টিমাইজেশান: কঠোরতা বিশ্লেষণ

অন্য কথায়, কঠোর কোডটিকে অপ্টিমাইজেশন হিসাবে যে কোনও জায়গায় তৈরি করা যেতে পারে , কারণ থাঙ্কগুলি তৈরি করা অহেতুক ব্যয়বহুল যখন ডেটা সর্বদা প্রয়োজন হবে (এবং / অথবা কেবল একবার ব্যবহার করা যেতে পারে)।

… মান নিয়ে আর কোনও মূল্যায়ন করা যায় না; এটি স্বাভাবিক আকারে বলে জানা যায় । আমরা যদি মধ্যবর্তী পদক্ষেপগুলির কোনওরূপে থাকি যাতে আমরা কোনও মান সম্পর্কে কমপক্ষে কিছু মূল্যায়ন করে থাকি তবে এটি দুর্বল মাথার স্বাভাবিক আকারে (ডাব্লুএইচএনএফ) থাকে। (একটি 'হেড নরমাল ফর্ম'ও রয়েছে, তবে এটি হাস্কেলটিতে ব্যবহৃত হয় না)

- উইকিবুকস হাস্কেল: অলসতা

(একটি শব্দ হয় স্বাভাবিক ফর্ম মাথা যদি মাথা অবস্থানে কোন বেটা-redex হয় 1 । একজন redex একটি মাথা redex থাকেন তাহলে সেটি শুধুমাত্র অ redexes এর ল্যামডা abstractors পূর্বে হয় 2 ।) সুতরাং যখন আপনি একটি thunk বলপূর্বক শুরু, আপনি ডাব্লুএইচএনএফ-এ কাজ করছেন; জোর করার জন্য যখন আর কোনও থঙ্ক নেই, আপনি স্বাভাবিক ফর্মে আছেন in আর একটি আকর্ষণীয় বিষয়:

… যদি কোনও মুহুর্তে আমাদের ব্যবহারকারীর কাছে z প্রিন্ট করা দরকার ছিল, আমাদের এটির সম্পূর্ণ মূল্যায়ন করা দরকার ...

কোনটি প্রাকৃতিকভাবে যে বোঝা, প্রকৃতপক্ষে, কোন IOকর্ম থেকে সঞ্চালিত main করে বল মূল্যায়ন, যা বিবেচনা করা যে Haskell, প্রোগ্রাম না, আসলে, কিছু করার সুস্পষ্ট হওয়া উচিত। ক্রমটি নির্ধারিত ক্রমটি অতিক্রম করতে হবে এমন যে কোনও কিছু mainঅবশ্যই স্বাভাবিক আকারে হওয়া উচিত এবং তাই কঠোর মূল্যায়নের সাপেক্ষে।

সিএ ম্যাকান, ডান মন্তব্য বুঝেছি যদিও: শুধুমাত্র জিনিস সম্পর্কে বিশেষ যে mainযে mainবিশেষ হিসাবে সংজ্ঞায়িত করা হয়; কনডাক্টররে প্যাটার্ন IOমিলটি মোনাড দ্বারা আরোপিত ক্রমটি নিশ্চিত করার জন্য যথেষ্ট । সে ক্ষেত্রে শুধুমাত্র seqএবং প্যাটার্ন-মিলগুলি মৌলিক।


4
আসলে "এই উক্তিটি যদি কোনও পর্যায়ে আমাদের ব্যবহারকারীর কাছে z প্রিন্ট করার দরকার পড়ে, আমাদের এটির সম্পূর্ণ মূল্যায়ন করা দরকার" সম্পূর্ণরূপে সঠিক নয়। এটি Showমূল্য মুদ্রণের জন্য উদাহরণ হিসাবে কঠোর ।
মনোনীত

10

হাস্কেল এএফাইক একটি খাঁটি আলস্য ভাষা নয়, বরং একটি কঠোর ভাষা language এর অর্থ এটি শেষ সম্ভাব্য মুহুর্তে শর্তাদি প্রয়োজনীয়ভাবে মূল্যায়ন করে না।

"অলসতার" জন্য হাস্কেলের মডেলটির একটি ভাল উত্স এখানে পাওয়া যাবে: http://en.wikibooks.org/wiki/Haskell/Laziness

মূলত, একটি থাঙ্ক এবং দুর্বল শিরোনামের স্বাভাবিক ফর্ম ডাব্লুএইচএএনএফের মধ্যে পার্থক্যটি বোঝা গুরুত্বপূর্ণ।

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

যেহেতু এটি একটি ভয়াবহ স্থান ফাঁসের দিকে পরিচালিত করবে, সংকলক তারপরে স্থান সংরক্ষণের জন্য কীভাবে এবং কখন ঠুনগুলি মূল্যায়ন করতে হবে তা নির্ধারণ করে। প্রোগ্রামার তারপরে নেস্টেড থঙ্কগুলির আকারে স্থানের ব্যবহার আরও কমাতে কঠোরতার সাথে মন্তব্যগুলি (en.wikibooks.org/wiki/Haskell/Stricness, www.haskell.org/haskellwiki/Performance/Stistanceness) দিয়ে এই প্রক্রিয়াটিকে সমর্থন করতে পারে।

আমি হাস্কেলের অপারেশনাল শব্দার্থবিজ্ঞানের বিশেষজ্ঞ নই, সুতরাং আমি লিঙ্কটি কেবল একটি উত্স হিসাবে ছেড়ে দেব।

আরও কিছু সংস্থান:

http://www.haskell.org/haskellwiki/ পারফরম্যান্স / অলসতা

http://www.haskell.org/haskellwiki/ হ্যাস্কেল / লাজি_ মূল্যায়ন


6

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

একটি শিক্ষানবিস জন্য, থাম্ব একটি প্রাথমিক নিয়ম letঅলস, caseকম অলস হয়।


4
নোট করুন যে caseসর্বদা জিএইচসি কোর-এ মূল্যায়ন করার জন্য বাধ্য করা হয়, এটি নিয়মিত হাস্কেলে এটি করে না। উদাহরণস্বরূপ, চেষ্টা করুন case undefined of _ -> 42
হামার

4
caseGHC মধ্যে কোর, WHNF তার যুক্তি মূল্যায়ণ যখন caseমধ্যে Haskell, যুক্তি মূল্যায়ণ হিসাবে প্রয়োজন যতটা উপযুক্ত শাখা নির্বাচন করতে। হামার উদাহরণে, এটি মোটেও নয়, তবে case 1:undefined of x:y:z -> 42এটি ডাব্লুএইচএনএফ থেকে গভীরতর মূল্যায়ন করে।
সর্বাধিক

এবং এগুলিও case something of (y,x) -> (x,y)মূল্যায়ন somethingকরার দরকার নেই needs এটি সমস্ত পণ্যের ধরণের ক্ষেত্রে সত্য।
ইনগো

@ ইঙ্গো - এটি ভুল। somethingটিউপল কনস্ট্রাক্টর পৌঁছানোর জন্য ডাব্লুএইচএনএফ-এর মূল্যায়ন করা দরকার।
জন এল

জন - কেন? আমরা জানি যে এটি অবশ্যই একটি টিউপল হতে পারে, সুতরাং এটির মূল্যায়ন করার বিষয়টি কোথায়? এটি যথেষ্ট হয় যদি x এবং y কোডের সাথে আবদ্ধ হয় যা টিউপলের মূল্যায়ন করে এবং যথাযথ স্লটটি বের করে, তাদের নিজেরাই যদি কখনও প্রয়োজন হয়।
ইঙ্গো

4

এটি কর্মফলকে লক্ষ্য করে একটি সম্পূর্ণ উত্তর নয়, তবে ধাঁধাটির একটি অংশ - এটি শব্দার্থবিজ্ঞানের বিষয়ে যে পরিমাণে রয়েছে তা মনে রাখবেন যে একাধিক মূল্যায়ন কৌশল রয়েছে যা একই শব্দার্থবিজ্ঞান সরবরাহ করে। এখানে একটি ভাল উদাহরণ - এবং প্রকল্পটি আমরা সাধারণত হ্যাস্কেল শব্দার্থক সম্পর্কে কীভাবে চিন্তা করি তার সাথে কথা বলেছি - এটি ছিল ইজিগার হাস্কেল প্রকল্প, যা একই শব্দার্থিক রক্ষণাবেক্ষণের সময় মূল্যায়ন কৌশলকে আমূল পরিবর্তন করেছিল: http://csg.csail.mit.edu/ পাব / haskell.html


2

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

প্রকৃত ভাষায় অবশ্যই এটি ঘটে না। সংকলক হাস্কেলকে একটি অত্যন্ত পরিশীলিত উপায়ে রূপান্তরিত করে, যতটা সম্ভব অলস এবং যে কোনও কিছু যা সর্বদা অলস প্রয়োজন হিসাবে তৈরি করে। অতিরিক্তভাবে, এখানে আনবক্সযুক্ত মান এবং টিপলস রয়েছে যা সর্বদা কঠোর।

আপনি যদি হাত দ্বারা কোনও ফাংশনটি মূল্যায়নের চেষ্টা করেন তবে আপনি মূলত ভাবতে পারেন:

  • রিটার্নের বাইরেরতম নির্মাণকারীর মূল্যায়ন করার চেষ্টা করুন।
  • ফলাফল পাওয়ার জন্য যদি অন্য কিছু প্রয়োজন হয় (তবে কেবল এটির সত্যিকার প্রয়োজন হলে) এছাড়াও মূল্যায়ন করা হবে। অর্ডারটি গুরুত্ব দেয় না।
  • আইওর ক্ষেত্রে আপনাকে প্রথম থেকে শেষ অবধি সমস্ত বিবরণের ফলাফল মূল্যায়ন করতে হবে। এটি কিছুটা জটিল, যেহেতু আইও মনাদ একটি নির্দিষ্ট ক্রমে মূল্যায়নকে বাধ্য করার জন্য কিছু কৌশল করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.