একটি প্রাক্কলিত ফাংশন হিসাবে একটি প্যাটার্ন ব্যবহার করার জন্য কি কোনও সুবিধাজনক উপায় আছে?


10

আমি সম্প্রতি এমন পরিস্থিতিতে দৌড়াচ্ছি যেখানে আমার কোনও প্রাক্কলিত ক্রিয়াকে অন্য ফাংশনে পাস করার দরকার পড়েছিল এবং প্রায়শই যে যুক্তিটি আমি সন্ধান করি তা মূলত "এই মানটি কি এই প্যাটার্নের সাথে মেলে?"

ঘোষণাপত্র, doব্লক এবং তালিকা বোঝার ক্ষেত্রে প্যাটার্নের মিলটি পছন্দ হয় বলে মনে হয় , তবে এমন অনেকগুলি ফাংশন রয়েছে যা একটি প্রাকটিক্যাল গ্রহণ করে a -> Bool, যেখানে কোনও নকশায় এটি কোনওভাবে পাস করা খুব সহজ হবে। উদাহরণস্বরূপ, takeWhile, until, find, span, ইত্যাদি

এখনও অবধি আমি করছিলাম \a -> case a of MyCons _ -> True; otherwise -> False, বা একটি নামকৃত ফাংশনটি লা লিখছি let myPred (MyCons _) = True; myPred _ = False inতবে তারা উভয়ই ভীষণ কুৎসিত এবং খুব মূর্তিমান মনে হচ্ছে না। "সুস্পষ্ট" (এবং ভুল) \(MyCons _) -> Trueউপায়টি এমন কিছু হতে পারে তবে এটি আংশিক, স্বাভাবিকভাবেই হয়ে যাওয়ার জন্য ত্রুটি ছুঁড়ে দেয় এবং তারপরেও এটি মনে হয় যে কোনও পরিষ্কার উপায় থাকতে হবে।

এই ধরণের জিনিসটি করার জন্য আরও কোনও সংক্ষিপ্ত / পরিষ্কার উপায় আছে? বা আমি পুরোপুরি ভুল উপায়ে যাচ্ছি?


1
হতে পারে এটি একটি "ব্যক্তিগত স্বাদ" জিনিস তবে আপনার যদি কেবল একটি জায়গায় এই শিকারীর প্রয়োজন হয় তবে আপনি letযে অনুচ্ছেদে অপছন্দ করেন সে সম্পর্কে আমি যথেষ্ট খুশি হব - যদিও আমি সমতুল্য whereধারাটি পছন্দ করি তাই এটি মূল সংজ্ঞাটিকে বিশৃঙ্খলা না করে। অবশ্যই যদি আপনার এই ইউটিলিটির একাধিকবার প্রয়োজন হয় তবে আপনি এটিকে শীর্ষ স্তরের ফাংশন হিসাবে সংজ্ঞায়িত করবেন।
রবিন জিগমন্ড

এটি অবশ্যই ভাল কাজ করে। আমার প্রশ্ন হাস্কেল সাধারণত চিত্তাকর্ষকভাবে কতটা চিত্তাকর্ষক তা দ্বারা উদ্বুদ্ধ হয়েছিল। এটিকে সাধারনত মনে হয় ইডিয়োমেটিক হাস্কেলের কাছে ধারণার খুব কম সদৃশতা রয়েছে এবং এগুলি সর্বনিম্নে ফ্লফ করে রাখে। সুতরাং এটি এমনকি অগত্যা নয় যে আমি মনে করি let myPred...শৈলীটি খারাপ , তবে এটি একটি খুব সাধারণ ধারণার প্রত্যাশার চেয়ে অনেক বেশি ভার্জোজ অনুভব করে, যা আমাকে ভুল গাছটিকে ছাঁটাই করছে কিনা তা নিয়ে ভাবতে পরিচালিত করে।
ডেভিড স্যাম্পসন

2
আপনার প্রিজমগুলির দিকে নজর দেওয়া উচিত (লেন্স থেকে)। এগুলি প্রথম শ্রেণীর কম্পোজেবল নিদর্শনগুলির মতো
লুউকি

1
আমি মনে করি আপনি এই ধরণের উচ্চ-অর্ডার ফাংশনটি কোথায় ব্যবহার করছেন তার একটি উদাহরণ আমাদের দেখতে হবে। আমার একটি অংশ বলতে চাইছে যে সমস্যাটি সেই ডিজাইনের সাথে প্রথম দিকে যেমন একটি শিকারের প্রয়োজন হয়।
চিপনার

এর জন্য হাস্কেল ৯৮ উপায়টি হ'ল আপনার ডেটা টাইপের ক্ষেত্রে কেস ম্যাচিং (ডিকনস্ট্রাকচারিং) ফাংশনটি সংজ্ঞায়িত করা, যেমন 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। এটি আপনি যা লিখেছিলেন প্রায় এটিই কেবল কার্যক্ষম আর্গুমেন্ট (গুলি) এর মাধ্যমে আরও "স্তর" / "বিমূর্ততা" রয়েছে, এটিতে বেকড।
নেস

উত্তর:


7

আপনি ল্যাঙ্গুয়েজ এক্সটেনশন ল্যাম্বড্যাস কেস ব্যবহার করতে পারেন \case MyCons _ -> True; _ -> False, যদিও এটি এতগুলি অক্ষর সংরক্ষণ করে না।

আমি বিশ্বাস করি আপনি ফাংশন একটি সিরিজ লিখতে পারে constructedWith :: (Generic a) => (b -> a) -> a -> Bool, constructedWith2 :: (Generic a) => (b -> c -> a) -> a -> Boolকিন্তু আমি কয়েক ঘন্টার কিছু পরীক্ষা ছাড়াই এটি বাস্তবায়ন করতে জেনেরিক্স সঙ্গে উপযুক্ত যথেষ্ট নই। আমি এটি চেষ্টা করব এবং আমি আমার উত্তরটি সম্পাদনা করব যদি আমি এটির সন্ধান করতে পারি, বা এটি যদি একটি শেষ পরিণতি হয়।

সম্পাদনা: হ্যাঁ, আপনি এটি করতে পারেন! এখানে আমার কোডের একটি লিঙ্ক রয়েছে যা স্ক্র্যাচ থেকে এগুলি সব প্রয়োগ করে:

https://repl.it/@lalaithion/ConstructedWith

তবে জেনেরিক কোড প্লাম্বিংয়ের জন্য http://hackage.haskell.org/package/generic-deriving-1.13.1/docs/ জেনারিক্স- ডেরাইভিং- কনন নেমস html এর মতো কিছু ব্যবহার করা ভাল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.