जोड़े, अनिवार्य रूप से, इस तरह परिभाषित कर रहे हैं:
data (,) a b = (,) a b
Functor
वर्ग इस तरह दिखता है:
class Functor f where
fmap :: (a -> b) -> f a -> f b
समारोह तर्क और परिणाम के प्रकार के बाद से तरह *
होना आवश्यक है (यानी वे प्रतिनिधित्व करते हैं उन कार्यों को टाइप करने के बजाय मूल्य जिन्हें आगे या अधिक विदेशी चीजों को लागू किया जा सकता है), हमारे पास a :: *
, b :: *
होना चाहिए, और सबसे महत्वपूर्ण बात यह है कि हमारे उद्देश्यों के लिए f :: * -> *
। चूंकि (,)
में * -> * -> *
है, इसलिए Functor
होने के लिए उपयुक्त प्रकार प्राप्त करने के लिए इसे *
पर लागू किया जाना चाहिए। इस प्रकार
instance Functor ((,) x) where
-- fmap :: (a -> b) -> (x,a) -> (x,b)
तो वहाँ वास्तव में कोई रास्ता नहीं एक Functor
उदाहरण कुछ और करने में लिखने के लिए है।
एक उपयोगी वर्ग कि Data.Bifunctor
से जोड़े के साथ काम करने के कई तरीके प्रदान करता है Bifunctor
है।
class Bifunctor f where
bimap :: (a -> b) -> (c -> d) -> f a c -> f b d
bimap f g = first f . second g
first :: (a -> b) -> f a y -> f b y
first f = bimap f id
second :: (c -> d) -> f x c -> f x d
second g = bimap id g
यह आपको (Data.Bifunctor.Join
से) निम्नलिखित जैसी चीजों के बारे में कर सकते हैं:
newtype Join p a =
Join { runJoin :: p a a }
instance Bifunctor p => Functor (Join p) where
fmap f = Join . bimap f f . runJoin
Join (,)
तो अनिवार्य रूप से, Pair
, जहां
data Pair a = Pair a a
बेशक
रूप में ही है आप भी कर सकते हैं जोड़े के साथ काम करने के लिए बस Bifunctor
उदाहरण का उपयोग करें।
दरअसल, यह मज़ेदार वर्ग के उदाहरण के रूप में उपयोगी है। उदाहरण के लिए, मैं एक पेड़ को 'टाइप ट्री ए = फ्री टी 2 ए' के रूप में परिभाषित कर सकता हूं। वास्तव में, उस प्रकार के अधिकांश उपयोग (एक मज़ेदार के रूप में इसकी क्षमता में) में कुछ प्रकार की शाखा या समेकन शामिल है। –
यह उल्लेखनीय है कि यदि आप टुपल के किस हिस्से को मानचित्र पर निर्दिष्ट करना चाहते हैं, तो आप 'Control.Lens' का उपयोग कर सकते हैं। एक 'सेटर' एक' फंक्टर 'उदाहरण जैसा है जिसे आप स्पष्ट रूप से निर्दिष्ट करते हैं, इसलिए '_1 (+1) (5,3)' ==> '(6,3)'; '_2 (* 2) (" मजाकिया, 2) '==>' ("मजेदार", 4) '; दोनों लंबाई (" हाय "," वहां ") '==>' (2,5) ';' ओवर (दोनों ._1) (* 10) ((1,2), (3,4)) '==>' ((10,2), (30,4)) ' – shachaf
धन्यवाद @ शचाफ , यह एक उपयोगी टिप्पणी है। –