2012-10-23 5 views

उत्तर

14

आप से Control.Arrow

> map (f *** f) a 

(***) ऑपरेटर का उपयोग करें या अपना स्वयं सहायक समारोह

> let both f (x, y) = (f x, f y) 
> map (both f) a 
+3

या शायद सिर्फ एक लैम्ब्डा: 'मानचित्र (\ (x, y) -> (f x, f y)) a' – MtnViewMark

5

परिभाषित आप lens का उपयोग करते हैं, तो आप over both f, या both %~ f उपयोग कर सकते हैं कर सकते हैं। इसका अधिक अनुकूल होने का लाभ है - उदाहरण के लिए, यदि आपके पास सूचियों की एक जोड़ी है, तो आप both.mapped +~ toUpper (:: ([Char],[Char]) -> ([Char],[Char])) जैसे कुछ का उपयोग कर सकते हैं।

11

वैकल्पिक समाधान:

import Data.Bifunctor 

bimap f f pair 

Bifunctor.bimap मूल रूप से भी Arrow.(***) रूप में ही है, लेकिन अन्य bifunctors (Either a b की तरह) के लिए काम करता है।

विषयांतर:

कारण है कि अपने मामले के लिए पूर्वनिर्धारित कोई बात नहीं है कि आप नहीं एक ही तत्व दो बार टाइप होने (,) के लिए की Functor, Applicative आदि उदाहरणों में लिख सकते हैं।

data Pair a = Pair a a deriving Show 

instance Functor Pair where 
    fmap f (Pair x y) = Pair (f x) (f y) 

अब आप map (fmap (+1)) [Pair 12 14, Pair 17 18] तरह बातें लिख सकते हैं: एक अपने "वेक्टर की तरह" प्रकार के साथ आप इस समस्या नहीं होती।

instance Applicative Pair where 
    pure x = Pair x x 
    (Pair f g) <*> (Pair x y) = Pair (f x) (g y) 

आप एक ही तत्व प्रकार जोड़े के साथ एक बहुत काम करते हैं, यह (,) से एक इस तरह करने के लिए स्विच करने के लिए उपयोगी हो सकता है: या फिर आप अपने Pair पर विभिन्न कार्यों का उपयोग करना चाहते हैं, तो आप एक कदम आगे जा सकते हैं प्रकार।

+0

digression के लिए धन्यवाद। –

संबंधित मुद्दे

 संबंधित मुद्दे