হাস্কেল ঘোষণায় বিস্মৃত চিহ্নটির অর্থ কী?


261

আমি আসল প্রকল্পটি চালানোর জন্য এটি ব্যবহার করে শেখার চেষ্টা করার সাথে সাথে আমি নিম্নলিখিত সংজ্ঞাটি পেলাম। আমি বুঝতে পারি না প্রতিটি যুক্তির সামনে উদ্দীপনা চিহ্নটির অর্থ কী এবং আমার বইগুলি এর উল্লেখ করেছে বলে মনে হয় না।

data MidiMessage = MidiMessage !Int !MidiMessage

13
আমি সন্দেহ করি যে এটি খুব সাধারণ প্রশ্ন হতে পারে; আমি ঠিক একই জিনিসটি সম্পর্কে নিজেকে অবাক করে মনে করি, কখন ফিরে আসছি।
সিজেএস

উত্তর:


313

এটি কঠোরতার ঘোষণা। মূলত, এর অর্থ হ'ল যখন ডেটা স্ট্রাকচারের মান তৈরি হয় তখন তাকে "দুর্বল মাথার সাধারণ ফর্ম" বলা হয় তার মূল্যায়ন করতে হবে। আসুন একটি উদাহরণ তাকান, যাতে আমরা এর অর্থ কী তা দেখতে পারি:

data Foo = Foo Int Int !Int !(Maybe Int)

f = Foo (2+2) (3+3) (4+4) (Just (5+5))

fউপরের ক্রিয়াকলাপটি যখন মূল্যায়ন করা হবে তখন একটি "থঙ্ক" ফিরিয়ে দেবে: এটি হ'ল কোডটির মান নির্ধারণের জন্য কার্যকর করা কোড। এই মুহুর্তে, একটি ফু এখনও উপস্থিত নেই, কেবল কোড।

তবে কোনও এক সময় কেউ এর অভ্যন্তরে দেখার চেষ্টা করতে পারে, সম্ভবত কোনও প্যাটার্ন ম্যাচের মাধ্যমে:

case f of
     Foo 0 _ _ _ -> "first arg is zero"
     _           -> "first arge is something else"

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

দ্বিতীয়টি মূল্যায়ন করার দরকার নেই, কারণ আমরা এটি পরীক্ষা করছি না। সুতরাং, 6সেই মেমরির স্থানে সংরক্ষণের পরিবর্তে , আমরা সম্ভবত পরবর্তী মূল্যায়নের জন্য কোডটি সংরক্ষণ করব (3+3),। কেউ এটির দিকে তাকালে কেবল এটি 6 এ পরিণত হবে।

তৃতীয় প্যারামিটারটির !সামনে একটি সামঞ্জস্য রয়েছে, তাই কঠোরভাবে মূল্যায়ন করা হয়: (4+4)কার্যকর হয় এবং8 করা হয় এবং সেই মেমরির জায়গায় সংরক্ষণ করা হয়।

চতুর্থ প্যারামিটারটিও কঠোরভাবে মূল্যায়ন করা হয়। তবে এখানে এটি কিছুটা জটিল হয়ে ওঠে: আমরা সম্পূর্ণরূপে নয়, তবে কেবলমাত্র সাধারণ মাথা ফর্মকেই মূল্যায়ন করছি। এর অর্থ হ'ল এটি Nothingবা Justকিছু আছে কিনা তা আমরা খুঁজে বের করি এবং তা সঞ্চয় করি তবে আমরা আর এগিয়ে যাই না। এর অর্থ হ'ল আমরা সংরক্ষণ করি না Just 10তবে প্রকৃতপক্ষে Just (5+5), আঞ্চলিক প্রবেশমূলটিকে নির্মূল করে। এটি জেনে রাখা গুরুত্বপূর্ণ, যদিও আমি মনে করি যে এর সমস্ত নিদর্শনগুলি এই প্রশ্নের ক্ষেত্রের বাইরে নয় rather

আপনি যদি BangPatternsভাষা এক্সটেনশান সক্ষম করেন তবে আপনি একইভাবে ফাংশন আর্গুমেন্টগুলি টিকিয়ে দিতে পারেন :

f x !y = x*y

f (1+1) (2+2)থাঙ্ক ফিরে আসবে (1+1)*4


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

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

8
@ ডেভিড: আমি এখানে আরও গভীরভাবে ব্যাখ্যা লিখেছি: হাস্কেল: দুর্বল প্রধান সাধারণ ফর্মটি কী? । যদিও আমি ব্যাঙের নিদর্শনগুলি বা কঠোরতার টীকা উল্লেখ করি না, সেগুলি ব্যবহারের সমতুল্য seq
হামার

1
কেবলমাত্র আমি বুঝতে পেরেছি তা নিশ্চিত করেই: এই অলসতা কি কেবল সংকলনের সময় যুক্তির সাথে অজানা সম্পর্কিত? অর্থাত্ যদি সোর্স কোডটির সত্যই কোনও বিবৃতি থাকে (2 + 2) , তবে এখনও এটি পরিচিত নম্বরগুলি যুক্ত করার জন্য কোড না রেখে 4 এ অনুকূলিত হবে ?
হাই-এঞ্জেল

1
হাই-অ্যাঞ্জেল, সংকলকটি কতদূর অপ্টিমাইজ করতে চায় তা ঠিক এটি up যদিও আমরা কিছুটা সাধারণ মাথা ফর্মকে কিছু জোর করে চাপিয়ে দিতে চাই তার জন্য ব্যাংস ব্যবহার করি, তবে আমাদের বলার উপায় নেই (এবং আমাদের প্রয়োজন বা প্রয়োজনও নেই) "দয়া করে নিশ্চিত করুন যে আপনি এখনও এই কান্ডটির মূল্যায়ন করেননি? আরও পদক্ষেপ। " একটি অর্থপূর্ণ দৃষ্টিকোণ থেকে, একটি "শূন্য" n = 2 + 2 "দেওয়া, আপনি এমনকি এন এর কোনও নির্দিষ্ট রেফারেন্স এখনই মূল্যায়ন করা হচ্ছে বা এর আগে মূল্যায়ন করা হয়েছিল কিনা তাও আপনি বলতে পারবেন না ।
সিজেএস

92

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

data Foo = Foo Int !Int

first (Foo x _) = x
second (Foo _ y) = y

যেহেতু অ-কঠোর যুক্তি দ্বারা মূল্যায়ন করা হয় না second, তাই পাস করার undefinedফলে কোনও সমস্যা হয় না:

> second (Foo undefined 1)
1

তবে কঠোর যুক্তি হতে পারে না undefined , এমনকি যদি আমরা মানটি ব্যবহার না করি:

> first (Foo 1 undefined)
*** Exception: Prelude.undefined

2
এটি কার্ট স্যাম্পসনের উত্তরের চেয়ে ভাল কারণ এটি !অভ্যন্তরীণ বাস্তবায়নের বিশদটি আবিষ্কার করার পরিবর্তে প্রতীকটির ব্যবহারকারী-পর্যবেক্ষণযোগ্য প্রভাবগুলি ব্যাখ্যা করে ।
ডেভিড গ্রেসন

26

আমি বিশ্বাস করি এটি একটি কঠোরতা টীকা।

হাস্কেল খাঁটি এবং অলস is কার্যকরী ভাষা, তবে কখনও কখনও অলসতার ওভারহেড খুব বেশি বা অপচয়যোগ্য হতে পারে। সুতরাং এটি মোকাবেলা করার জন্য, আপনি সংশ্লেষকে পার্শ্ব পরিবর্তনের পরিবর্তে কোনও কার্যক্রমে যুক্তিগুলি সম্পূর্ণরূপে মূল্যায়নের জন্য জিজ্ঞাসা করতে বলতে পারেন।

এই পৃষ্ঠায় আরও তথ্য রয়েছে: পারফরম্যান্স / কঠোরতা


হুম, আপনি যে পৃষ্ঠায় উল্লেখ করেছেন তার উদাহরণটি ব্যবহার সম্পর্কে কথা বলে মনে হচ্ছে! যখন একটি ফাংশন প্রার্থনা। তবে এটি কোনও প্রকারের ঘোষণায় রাখার চেয়ে আলাদা বলে মনে হচ্ছে। আমি কী মিস করছি?
ডেভিড

কোনও ধরণের উদাহরণ তৈরি করাও একটি অভিব্যক্তি। সরবরাহকারী আর্গুমেন্টগুলি দিয়ে আপনি টাইপ কনস্ট্রাক্টরগুলিকে ফাংশন হিসাবে ভাবতে পারেন যা নির্দিষ্ট ধরণের নতুন উদাহরণগুলি দেয় return
ক্রিস ভেস্ট

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