আমি সম্প্রতি এমন পরিস্থিতিতে দৌড়াচ্ছি যেখানে আমার কোনও প্রাক্কলিত ক্রিয়াকে অন্য ফাংশনে পাস করার দরকার পড়েছিল এবং প্রায়শই যে যুক্তিটি আমি সন্ধান করি তা মূলত "এই মানটি কি এই প্যাটার্নের সাথে মেলে?"
ঘোষণাপত্র, doব্লক এবং তালিকা বোঝার ক্ষেত্রে প্যাটার্নের মিলটি পছন্দ হয় বলে মনে হয় , তবে এমন অনেকগুলি ফাংশন রয়েছে যা একটি প্রাকটিক্যাল গ্রহণ করে a -> Bool, যেখানে কোনও নকশায় এটি কোনওভাবে পাস করা খুব সহজ হবে। উদাহরণস্বরূপ, takeWhile, until, find, span, ইত্যাদি
এখনও অবধি আমি করছিলাম \a -> case a of MyCons _ -> True; otherwise -> False, বা একটি নামকৃত ফাংশনটি লা লিখছি let myPred (MyCons _) = True; myPred _ = False inতবে তারা উভয়ই ভীষণ কুৎসিত এবং খুব মূর্তিমান মনে হচ্ছে না। "সুস্পষ্ট" (এবং ভুল) \(MyCons _) -> Trueউপায়টি এমন কিছু হতে পারে তবে এটি আংশিক, স্বাভাবিকভাবেই হয়ে যাওয়ার জন্য ত্রুটি ছুঁড়ে দেয় এবং তারপরেও এটি মনে হয় যে কোনও পরিষ্কার উপায় থাকতে হবে।
এই ধরণের জিনিসটি করার জন্য আরও কোনও সংক্ষিপ্ত / পরিষ্কার উপায় আছে? বা আমি পুরোপুরি ভুল উপায়ে যাচ্ছি?
let myPred...শৈলীটি খারাপ , তবে এটি একটি খুব সাধারণ ধারণার প্রত্যাশার চেয়ে অনেক বেশি ভার্জোজ অনুভব করে, যা আমাকে ভুল গাছটিকে ছাঁটাই করছে কিনা তা নিয়ে ভাবতে পরিচালিত করে।
maybe :: b -> (a -> b) -> Maybe a -> bএবং bool :: a -> a -> Bool -> aতারপরে এটি বুলিয়ান-প্রযোজনা ফাংশন (গুলি) দিয়ে যুক্তি (গুলি) হিসাবে ব্যবহার করুন। যেমন myCons z f (MyCons x) = f x ; myCons z f _ = z, তারপরে কল করুন myCons False (const True) aMyConsValue। এটি আপনি যা লিখেছিলেন প্রায় এটিই কেবল কার্যক্ষম আর্গুমেন্ট (গুলি) এর মাধ্যমে আরও "স্তর" / "বিমূর্ততা" রয়েছে, এটিতে বেকড।
letযে অনুচ্ছেদে অপছন্দ করেন সে সম্পর্কে আমি যথেষ্ট খুশি হব - যদিও আমি সমতুল্যwhereধারাটি পছন্দ করি তাই এটি মূল সংজ্ঞাটিকে বিশৃঙ্খলা না করে। অবশ্যই যদি আপনার এই ইউটিলিটির একাধিকবার প্রয়োজন হয় তবে আপনি এটিকে শীর্ষ স্তরের ফাংশন হিসাবে সংজ্ঞায়িত করবেন।