Haskell Language
उच्चतर कार्य
खोज…
टिप्पणियों
हायर ऑर्डर फ़ंक्शंस वे फ़ंक्शंस हैं जो फ़ंक्शंस को पैरामीटर के रूप में लेते हैं और / या फ़ंक्शंस को उनके रिटर्न मान के रूप में लेते हैं।
हायर ऑर्डर फंक्शंस की मूल बातें
आगे बढ़ने से पहले आंशिक आवेदन की समीक्षा करें।
हास्केल में, एक फ़ंक्शन जो अन्य कार्यों को तर्क या रिटर्न फ़ंक्शन के रूप में ले सकता है, उसे उच्च-क्रम फ़ंक्शन कहा जाता है।
निम्नलिखित सभी उच्च-क्रम के कार्य हैं :
map :: (a -> b) -> [a] -> [b]
filter :: (a -> Bool) -> [a] -> [a]
takeWhile :: (a -> Bool) -> [a] -> [a]
dropWhile :: (a -> Bool) -> [a] -> [a]
iterate :: (a -> a) -> a -> [a]
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
scanr :: (a -> b -> b) -> b -> [a] -> [b]
scanl :: (b -> a -> b) -> b -> [a] -> [b]
ये विशेष रूप से उपयोगी हैं कि वे हमें उन कार्यों के शीर्ष पर नए कार्य बनाने की अनुमति देते हैं जो हमारे पास पहले से ही हैं, अन्य कार्यों के तर्क के रूप में कार्य करके। इसलिए नाम, उच्च क्रम के कार्य ।
विचार करें:
Prelude> :t (map (+3))
(map (+3)) :: Num b => [b] -> [b]
Prelude> :t (map (=='c'))
(map (=='c')) :: [Char] -> [Bool]
Prelude> :t (map zipWith)
(map zipWith) :: [a -> b -> c] -> [[a] -> [b] -> [c]]
यह कार्य आसानी से करने की क्षमता (जैसे कि आंशिक अनुप्रयोग द्वारा उपयोग किया जाता है जैसा कि यहाँ इस्तेमाल किया गया है) एक ऐसी विशेषता है जो कार्यात्मक प्रोग्रामिंग को विशेष रूप से शक्तिशाली बनाती है और हमें छोटे, सुरुचिपूर्ण समाधानों को प्राप्त करने की अनुमति देती है जो अन्यथा अन्य भाषाओं में दर्जनों लाइनें लेती हैं। उदाहरण के लिए, निम्न फ़ंक्शन हमें दो सूचियों में संरेखित तत्वों की संख्या प्रदान करता है।
aligned :: [a] -> [a] -> Int
aligned xs ys = length (filter id (zipWith (==) xs ys))
लैंबडा एक्सप्रेशन
लैंबडा अभिव्यक्ति अन्य भाषाओं में अनाम कार्यों के समान है।
लैम्ब्डा भाव खुले फॉर्मूले होते हैं जो वैरिएबल को भी निर्दिष्ट करते हैं जिन्हें बाध्य किया जाना है। मूल्यांकन (एक फ़ंक्शन कॉल के मूल्य का पता लगाना) तो उपयोगकर्ता द्वारा दिए गए तर्कों के साथ लैम्ब्डा अभिव्यक्ति के शरीर में बाध्य चर को प्रतिस्थापित करके प्राप्त किया जाता है। सीधे शब्दों में कहें, लंबोदर अभिव्यक्ति हमें चर बंधन और प्रतिस्थापन के माध्यम से कार्यों को व्यक्त करने की अनुमति देते हैं।
लैंबडा भाव दिखते हैं
\x -> let {y = ...x...} in y
एक लंबोदर अभिव्यक्ति के भीतर, तीर के बाईं ओर के चर को दाहिने-हाथ की ओर, यानी फ़ंक्शन के शरीर में बाध्य माना जाता है।
गणितीय कार्य पर विचार करें
f(x) = x^2
हास्केल परिभाषा के रूप में यह है
f x = x^2
f = \x -> x^2
जिसका अर्थ है कि फंक्शन f
लैम्बडा एक्सप्रेशन \x -> x^2
बराबर है।
उच्च-क्रम फ़ंक्शन map
के पैरामीटर पर विचार map
, जो कि a -> b
का प्रकार a -> b
। मामले में इसका उपयोग केवल एक बार map
करने के लिए और प्रोग्राम में कहीं और करने के लिए किया जाता है, इस तरह के फेकवे फंक्शन को नाम देने के बजाय इसे लैम्ब्डा एक्सप्रेशन के रूप में निर्दिष्ट करना सुविधाजनक है। एक लंबोदर अभिव्यक्ति के रूप में लिखा गया है,
\x -> let {y = ...x...} in y
x
प्रकार का एक मूल्य रखती है a
, ...x...
एक हास्केल अभिव्यक्ति है कि करने के लिए चर संदर्भित करता है x
, और y
प्रकार का एक मूल्य रखती है b
। इसलिए, उदाहरण के लिए, हम निम्नलिखित लिख सकते हैं
map (\x -> x + 3)
map (\(x,y) -> x * y)
map (\xs -> 'c':xs) ["apples", "oranges", "mangos"]
map (\f -> zipWith f [1..5] [1..5]) [(+), (*), (-)]
Currying
हास्केल में, सभी कार्यों को करीने से माना जाता है: अर्थात, हास्केल के सभी कार्य केवल एक तर्क लेते हैं।
चलो समारोह div
ले:
div :: Int -> Int -> Int
यदि हम इस फ़ंक्शन को 6 और 2 के साथ कहते हैं, तो हम अनिश्चित रूप से 3 प्राप्त करते हैं:
Prelude> div 6 2 3
हालाँकि, यह उस तरह से व्यवहार नहीं करता जैसा हम सोचते हैं। पहले div 6
का मूल्यांकन किया जाता है और Int -> Int
प्रकार का एक फ़ंक्शन देता है । यह परिणामी फ़ंक्शन तब मान 2 पर लागू होता है जो 3 पैदावार देता है।
जब हम एक समारोह के प्रकार के हस्ताक्षर को देखें, हम हमारी सोच बदल सकते हैं "प्रकार के दो तर्क लेता से Int
के लिए" "एक लेता है Int
और एक समारोह है कि एक लेता रिटर्न Int
"। यह पुन: पुष्टि की जाती है यदि हम उस तीर को टाइप नोटेशन एसोसिएट में दाईं ओर देखते हैं , इसलिए div
वास्तव में इस प्रकार पढ़ा जा सकता है:
div :: Int -> (Int -> Int)
सामान्य तौर पर, अधिकांश प्रोग्रामर भाषा सीखने के दौरान इस व्यवहार को कम से कम अनदेखा कर सकते हैं। सैद्धांतिक दृष्टिकोण से , "औपचारिक प्रमाण तब आसान होते हैं जब सभी कार्यों को समान रूप से व्यवहार किया जाता है (एक तर्क, एक परिणाम बाहर)।"