Haskell Language
क्रिया रचना
खोज…
टिप्पणियों
समारोह रचना ऑपरेटर (.)
के रूप में परिभाषित किया गया है
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(.) f g x = f (g x) -- or, equivalently,
(.) f g = \x -> f (g x)
(.) f = \g -> \x -> f (g x)
(.) = \f -> \g -> \x -> f (g x)
(.) = \f -> (\g -> (\x -> f (g x) ) )
प्रकार (b -> c) -> (a -> b) -> (a -> c)
रूप में लिखा जा सकता है (b -> c) -> (a -> b) -> a -> c
क्योंकि ->
दाईं ओर दिए गए फंक्शन एप्लिकेशन के अनुसार दाईं ओर स्थित हस्ताक्षर "सहयोगी" टाइप करें,
f g x y z ... == (((f g) x) y) z ...
तो "डेटाफ्लो" दाईं ओर से बाईं ओर है: x
"जाता है" g
, जिसका परिणाम f
में जाता है, अंतिम परिणाम का उत्पादन:
(.) f g x = r
where r = f (g x)
-- g :: a -> b
-- f :: b -> c
-- x :: a
-- r :: c
(.) f g = q
where q = \x -> f (g x)
-- g :: a -> b
-- f :: b -> c
-- q :: a -> c
....
कृत्रिम रूप से, निम्नलिखित सभी समान हैं:
(.) f g x = (f . g) x = (f .) g x = (. g) f x
" ऑपरेटर सेक्शन के तीन नियम" के रूप में समझ पाना आसान है, जहां "लापता तर्क" बस ऑपरेटर के पास खाली स्लॉट में जाता है:
(.) f g = (f . g) = (f .) g = (. g) f
-- 1 2 3
समीकरण के दोनों किनारों पर मौजूद x
छोड़ा जा सकता है। इसे एटा-संकुचन के रूप में जाना जाता है। इस प्रकार, फ़ंक्शन रचना के लिए परिभाषा लिखने का सरल तरीका बस है
(f . g) x = f (g x)
यह पाठ्यक्रम "तर्क" x
को संदर्भित करता है; जब भी हम x
बिना सिर्फ (f . g)
लिखते हैं तो इसे बिंदु मुक्त शैली के रूप में जाना जाता है।
दाएं-बाएं रचना
(.)
हमें दो कार्यों की रचना करने देता है, एक के आउटपुट को दूसरे को इनपुट के रूप में खिलाता है:
(f . g) x = f (g x)
उदाहरण के लिए, यदि हम एक इनपुट नंबर के उत्तराधिकारी को वर्ग करना चाहते हैं, तो हम लिख सकते हैं
((^2) . succ) 1 -- 4
वहाँ भी है (<<<)
जो एक उपनाम है (.)
। इसलिए,
(+ 1) <<< sqrt $ 25 -- 6
बाएँ से दाएँ रचना
Control.Category
परिभाषित (>>>)
, जो, जब कार्यों के लिए विशेष है
-- (>>>) :: Category cat => cat a b -> cat b c -> cat a c
-- (>>>) :: (->) a b -> (->) b c -> (->) a c
-- (>>>) :: (a -> b) -> (b -> c) -> (a -> c)
( f >>> g ) x = g (f x)
उदाहरण:
sqrt >>> (+ 1) $ 25 -- 6.0
बाइनरी फ़ंक्शन के साथ रचना
नियमित रचना एकात्मक कार्यों के लिए काम करती है। बाइनरी के मामले में, हम परिभाषित कर सकते हैं
(f .: g) x y = f (g x y) -- which is also
= f ((g x) y)
= (f . g x) y -- by definition of (.)
= (f .) (g x) y
= ((f .) . g) x y
इस प्रकार, एटा-संकुचन द्वारा और (इसके अलावा, (f .: g) = ((f .) . g)
, और इसके बाद,
(.:) f g = ((f .) . g)
= (.) (f .) g
= (.) ((.) f) g
= ((.) . (.)) f g
so (.:) = ((.) . (.))
, एक अर्ध-प्रसिद्ध परिभाषा।
उदाहरण:
(map (+1) .: filter) even [1..5] -- [3,5]
(length .: filter) even [1..5] -- 2