আমি Haskell, নতুন এবং আমি খুব দ্বারা বিভ্রান্ত করছি কোথায় বনাম যাক । তারা উভয় একটি অনুরূপ উদ্দেশ্য প্রদান বলে মনে হচ্ছে। আমি মধ্যে কয়েক তুলনা পড়া আছে কোথায় বনাম আসুন কিন্তু আমি কষ্ট নির্ণায়ক যখন প্রতিটি ব্যবহার করতে হচ্ছে না। কেউ দয়া করে কিছু প্রসঙ্গ সরবরাহ করতে পারেন বা কয়েকটি উদাহরণ প্রদান করতে পারেন যা দেখায় যে যখন একে অপরকে ব্যবহার করতে হয়?
যেখানে বনাম
একটি
where
ধারা কেবল একটি ফাংশন সংজ্ঞা স্তরে সংজ্ঞায়িত করা যেতে পারে। সাধারণত, এটিlet
সংজ্ঞার ক্ষেত্রের অনুরূপ । পার্থক্য শুধুমাত্র যখন রক্ষী ব্যবহার করা হয় ।where
ধারাটির ব্যাপ্তি সমস্ত প্রহরীদের উপর প্রসারিত। বিপরীতে, একটিlet
অভিব্যক্তির সুযোগটি কেবলমাত্র বর্তমান ফাংশন ক্লজ এবং গার্ড, যদি থাকে তবে।
Haskell, উইকি খুব বিস্তারিত এবং বিভিন্ন ঘটনা উপলব্ধ কিন্তু এটা প্রকল্পিত উদাহরণ ব্যবহার করেছেন। আমি এর ব্যাখ্যাগুলি একটি শিক্ষানবিশকে খুব সংক্ষিপ্ত বলে মনে করি।
লেট এর সুবিধা :
f :: State s a
f = State $ \x -> y
where y = ... x ...
কাজ করবে না, কারণ যেখানে প্যাটার্ন মেলে f = বোঝায়, যেখানে কোনও এক্সের সুযোগ নেই। বিপরীতে, আপনি যদি লেট দিয়ে শুরু করেছিলেন, তবে আপনার কোনও সমস্যা হবে না।
হাস্কেল উইকি অ্যাডভান্সটেভস অফ লেট
f :: State s a
f = State $ \x ->
let y = ... x ...
in y
যেখানে সুবিধা :
f x
| cond1 x = a
| cond2 x = g a
| otherwise = f (h x a)
where
a = w x
f x
= let a = w x
in case () of
_ | cond1 x = a
| cond2 x = g a
| otherwise = f (h x a)
Haskell, উইকি উল্লেখ করেছেন যে কোথায় দফা ঘোষণামূলক থাকাকালীন আসুন অভিব্যক্তি ভাবপূর্ণ হয়। স্টাইল বাদে তারা কীভাবে আলাদাভাবে পারফর্ম করে?
Declaration style | Expression-style
--------------------------------------+---------------------------------------------
where clause | let expression
arguments LHS: f x = x*x | Lambda abstraction: f = \x -> x*x
Pattern matching: f [] = 0 | case expression: f xs = case xs of [] -> 0
Guards: f [x] | x>0 = 'a' | if expression: f [x] = if x>0 then 'a' else ...
- প্রথম উদাহরণে কেন যাক সুযোগ কিন্তু কোথায় নয়?
- প্রথম উদাহরণটি কোথায় ব্যবহার করা সম্ভব ?
- কিছুগুলি বাস্তব উদাহরণগুলিতে এটি প্রয়োগ করতে পারে যেখানে ভেরিয়েবলগুলি প্রকৃত প্রকাশের প্রতিনিধিত্ব করে?
- প্রত্যেকটি কখন ব্যবহার করবেন তা অনুসরণ করার জন্য কোনও সাধারণ নিয়ম রয়েছে?
হালনাগাদ
এই থ্রেড পরে যারা আসে তাদের জন্য আমি এখানে সন্ধানের সেরা ব্যাখ্যাটি পেয়েছি: " হাস্কেলের একটি নম্র ভূমিকা "।
এক্সপ্রেশন দিন।
যখনই কোনও নেস্টেট বাইন্ডিংয়ের সেট প্রয়োজন হয় তখনই হাস্কেলের লেট এক্সপ্রেশনগুলি দরকারী। একটি সাধারণ উদাহরণ হিসাবে, বিবেচনা করুন:
let y = a*b f x = (x+y)/y in f c + f d
একটি লেট এক্সপ্রেশন দ্বারা নির্মিত বাইন্ডিংয়ের সেটটি পারস্পরিক পুনরাবৃত্ত হয় এবং প্যাটার্ন বাইন্ডিংগুলিকে অলস নিদর্শন হিসাবে গণ্য করা হয় (অর্থাত তারা একটি অন্তর্নিহিত বহন করে ~)। অনুমোদিত একমাত্র প্রকারের ঘোষণাগুলি হ'ল প্রকার স্বাক্ষর, ফাংশন বাইন্ডিং এবং প্যাটার্ন বাইন্ডিং।
যেখানে ক্লজ।
কখনও কখনও এটি বেশ কয়েকটি সুরক্ষিত সমীকরণের সাথে স্কোপ বাইন্ডিংগুলির পক্ষে সুবিধাজনক, যার জন্য যেখানে ক্লজ প্রয়োজন:
f x y | y>z = ... | y==z = ... | y<z = ... where z = x*x
নোট করুন যে এটি একটি লেট এক্সপ্রেশন দিয়ে করা যায় না, যা কেবলমাত্র এটির দ্বারা প্রকাশিত অভিব্যক্তিটির উপরেই যায়। একটি যেখানে সমীকরণ বা কেস এক্সপ্রেশনের সেটের শীর্ষ স্তরে ক্লজটি অনুমোদিত। একই বৈশিষ্ট্য এবং বাঁধাইয়ের প্রতিবন্ধকতাগুলি যেখানে মতামত রয়েছে সেখানে তাদের জন্য এই মত প্রকাশের জন্য প্রযোজ্য। নেস্টেড স্কোপ এই দুটি ফর্ম খুব অনুরূপ মনে হয়, কিন্তু মনে রাখবেন যে একটি লেট এক্সপ্রেশন একটি অভিব্যক্তি, যেখানে যেখানে ধারা নেই - এটি ফাংশন ডিক্লেয়ারেশন এবং কেস এক্সপ্রেশনগুলির সিনট্যাক্সের অংশ।
f = body where x = xbody; y = ybody ...
অর্থf = let x = xbody; y = ybody ... in body
case .... of ... where
কীভাবে কোনও অভিব্যক্তিতে রূপান্তর করা সম্ভব ? আমি এই সম্পর্কে নিশ্চিত নই।
let
এবং এর মধ্যে পার্থক্য দেখে আমি হতবাক হয়ে পড়েছিলামwhere
। আমি মনে করি এটি বোঝার সর্বোত্তম উপায় হ'ল বুঝতে হবে যে উভয়ের মধ্যে খুব কম পার্থক্য রয়েছে, এবং তাই চিন্তার কিছু নেই। একটি খুব সাধারণ যান্ত্রিক রূপান্তর মাধ্যমেwhere
পদ দেওয়া অর্থlet
। Haskell.org/onlinereport/decls.html#sect4.4.3.2 দেখুন এই রূপান্তরটি কেবলমাত্র স্বীকৃতিসংশ্লিষ্ট সুবিধার জন্যই বিদ্যমান।