मैं हाल ही में उन स्थितियों में भाग रहा हूं, जहां मुझे एक अन्य समारोह में एक विधेय समारोह पास करने की आवश्यकता है, और अक्सर मैं जो तर्क ढूंढ रहा हूं, वह अनिवार्य रूप से "क्या यह मूल्य इस पैटर्न से मेल खाता है?"
घोषणाओं, 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क्लॉज़ को पसंद करता हूँ ताकि यह मुख्य परिभाषा को अव्यवस्थित न करे। बेशक, यदि आपको इस उपयोगिता की आवश्यकता एक से अधिक बार समाप्त हो जाती है, तो आप इसे शीर्ष स्तर के कार्य के रूप में परिभाषित करेंगे।