पूर्वाग्रह मैं हूं, लेकिन मुझे लगता है कि यह Control.Newtype का उपयोग करने का एक शानदार अवसर है, किट का एक छोटा टुकड़ा जो केवल "कैबल इंस्टॉल न्यूटाइप" दूर है।
यहां सौदा है। आप एक अलग पैरामीटर में functoriality (उदाहरण के लिए) पर अपने हाथ पाने के लिए चारों ओर कन्स्ट्रक्टरों के चारों ओर फ्लिप करना चाहते हैं। एक newtype
newtype Flip f x y = Flip (f y x)
परिभाषित करें और Newtype
वर्ग इस प्रकार
instance Newtype (Flip f x y) (f y x) where
pack = Flip
unpack (Flip z) = z
Newtype
वर्ग उनके सरल समकक्ष करने के लिए सिर्फ एक निर्देशिका मानचित्रण newtypes, आसान किट प्रदान कर रहा है, उदाहरण के लिए इसे जोड़ने op Flip
Flip
के विपरीत है: आपको इसे याद रखने की आवश्यकता नहीं है जिसे आपने इसे कहा था।
प्रश्न में समस्या के लिए, हम अब इस तरह सामान कर सकते हैं:
data Bif x y = BNil | BCons x y (Bif x y) deriving Show
एक दो पैरामीटर डेटाप्रकार जो दोनों मानकों में functorial होने वाला है यही कारण है कि। (शायद, हम इसे एक Bifunctor वर्ग का एक उदाहरण बनाना चाहिए, लेकिन वैसे भी ...) हम इसे एक Functor
दो बार से अधिक कर सकते हैं: पिछले पैरामीटर के लिए एक बार ...
instance Functor (Bif x) where
fmap f BNil = BNil
fmap f (BCons x y b) = BCons x (f y) (fmap f b)
... और एक बार के लिए पहली:
instance Functor (Flip Bif y) where
fmap f (Flip BNil) = Flip BNil
fmap f (Flip (BCons x y b)) = Flip (BCons (f x) y (under Flip (fmap f) b))
जहां under p f
एक साफ रास्ता op p . f . p
कहने के लिए है।
मैं आपको कोई झूठ नहीं बताता: आज़माएं।
someBif :: Bif Int Char
someBif = BCons 1 'a' (BCons 2 'b' (BCons 3 'c' BNil))
और फिर हम
*Flip> fmap succ someBif
BCons 1 'b' (BCons 2 'c' (BCons 3 'd' BNil))
*Flip> under Flip (fmap succ) someBif
BCons 2 'a' (BCons 3 'b' (BCons 4 'c' BNil))
इन परिस्थितियों में मिलता है, वहाँ वास्तव में कई मायनों एक ही बात एक Functor
के रूप में देखा जा सकता है, तो यह सही है कहने के लिए कुछ शोर करना है कि हम जो जिस तरह से हमारा मतलब है। लेकिन अगर आप इसके बारे में व्यवस्थित हैं तो शोर इतना ज्यादा नहीं है।
नया प्रकार बहुत अच्छा है। यह इन पैकेजों में से एक है, जहां मैंने पहली बार इसे देखा, मैं चाहता था कि मैं इसे अपने पिछले पिछले काम में उपयोग करने के लिए जानूंगा। –
हालांकि यह अच्छा है और काम करता है, यह वास्तव में प्रश्न का उत्तर नहीं देता है क्योंकि आप अभी भी कुछ टाइप 2 के लिए फ़ैक्टर का उदाहरण नहीं बना सकते हैं (और केवल 'अंडर' रैपर फ़ंक्शन के बिना fmap का उपयोग करें)। – ivanm
मूल प्रश्न का उत्तर "नहीं" है। या कम से कम, हास्केल में नहीं। कुछ हद तक, यह काम करने के लिए असाधारण होगा कि उत्तर "हां" था। – pigworker