मैं इस तथ्य का प्रयोग करेंगे कि आप आसानी से परिवर्तित कर सकते हैं एक Bool
एक Int
का उपयोग करने के fromEnum
:
addif x acc y = acc + fromEnum (x == y)
अब आप यह बात-मुक्त बनाने के लिए हमेशा की तरह चालें लागू करने शुरू कर सकते हैं
-- Go prefix and use $
addif x acc y = (+) acc $ fromEnum $ (==) x y
-- Swap $ for . when dropping the last argument
addif x acc = (+) acc . fromEnum . (==) x
और इसी तरह। मैं इसे मुक्त करने के सभी मजे को दूर नहीं ले जाऊंगा, खासकर जब आपके लिए यह करने के लिए उपकरण हैं।
वैकल्पिक रूप से, आप की तरह
count x = sum . map (fromEnum . (==) x)
एक समारोह है जो लगभग मुफ्त बात लिख सकता है, और चालें है कि आप करीब हालांकि वे बहुत बुरा मिल जल्दी से, देखते हैं: मैं
count = fmap fmap fmap sum map . fmap fmap fmap fromEnum (==)
यहाँ लगता है कि यह (.)
के बजाय fmap
का उपयोग करने के लिए वास्तव में अच्छा दिखता है, हालांकि आप (.)
के साथ प्रतिस्थापित कर सकते हैं और यह वही कोड होगा।अनिवार्य रूप से, (fmap fmap fmap)
एक साथ एक भी तर्क और एक दो तर्क समारोह तैयार करता है, अगर आप के बजाय यह नाम .:
आप के रूप में
count = (sum .: map) . (fromEnum .: (==))
नीचे टूटी लिख सकते दे:
> :t fmap fmap fmap sum map
Num a => (a -> b) -> [a] -> b
तो यह एक समारोह लेता है b
से a
पर, b
एस की एक सूची, और a
पर लौटें, बहुत बुरा नहीं।
> :t fmap fmap fmap fromEnum (==)
Eq a => a -> a -> Int
और इस प्रकार के जो नोट करने के लिए एक महत्वपूर्ण बात है Eq a => a -> (a -> Int)
के रूप में लिखा जा सकता है,। इससे इस फ़ंक्शन का रिटर्न प्रकार fmap fmap fmap sum map
पर b ~ Int
के साथ इनपुट से मेल खाता है, इसलिए हम उन्हें Eq a => a -> [a] -> Int
प्रकार का फ़ंक्शन प्राप्त करने के लिए लिख सकते हैं।
chk :: Bool -> (a,a) -> a
chk = ([snd,fst]!!) . fromEnum
chk
इस्तेमाल करते हुए हम addIf
के एक अलग संस्करण परिभाषित कर सकते हैं:
क्या आपको गणित-चेनिगन्स जैसे 'चलो fxy = 1 - छत (इंटेग्रल (xy) /Integral y से) :: Int' करने की अनुमति है? (जो आपको बिल्कुल वही नहीं है;)) – Carsten
लेकिन '1 - छत (इंटग्राल (xy) से इंटग्राल (अधिकतम xy) से abs $) :: Int' अगर मुझे कुछ बुरा सीमा मामला याद नहीं आया तो शायद इसे करना चाहिए - शायद आप इसके बारे में कारण बनाना चाहते हैं या कुछ क्विक चेक चला सकते हैं;) (अच्छी तरह से मुझे कुछ नकारात्मक याद आते हैं, इसलिए आपको अधिक 'abs' करना होगा ... लेकिन सिद्धांत स्पष्ट होना चाहिए ... वास्तविक समाधान * तुच्छ * और पाठक के लिए छोड़ दिया **: डी **) – Carsten
सामान्य रूप से आप 'if' कथन को फ़ंक्शन' bool :: bool -> a -> a -> a के साथ प्रतिस्थापित कर सकते हैं; बूल झूठी एफ _ = एफ; बूल ट्रू _ टी = टी', इस मामले में आप हमेशा "सामान्य" अभिव्यक्ति बना सकते हैं जिसे नियमित तरीकों से मुक्त किया जा सकता है। – user2407038