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