लें वर्ग Functor
:टाइप क्लास में टाइप कंस्ट्रक्टर का उपयोग करने का कोई फायदा? उदाहरण के लिए
class Functor a
instance Functor Maybe
यहाँ Maybe
एक प्रकार निर्माता है। सबसे पहले मल्टी पैरामीटर प्रकार वर्गों का उपयोग
,:
लेकिन हम इस दो अन्य तरीकों से कर सकते हैं
class MultiFunctor a e
instance MultiFunctor (Maybe a) a
प्रकार परिवारों दूसरे का उपयोग कर:
class MonoFunctor a
instance MonoFunctor (Maybe a)
type family Element
type instance Element (Maybe a) a
अब वहाँ एक स्पष्ट है दो बाद के तरीकों का लाभ, अर्थात् यह हमें इस तरह की चीजों को करने की अनुमति देता है:
instance Text Char
या:
instance Text
type instance Element Text Char
तो हम monomorphic कंटेनर के साथ काम कर सकते हैं।
दूसरा फायदा यह है कि हम उन प्रकारों के उदाहरण बना सकते हैं जिनमें अंतिम पैरामीटर के रूप में टाइप पैरामीटर नहीं है। हम एक Either
शैली प्रकार बनाने लेकिन प्रकार के गलत तरीके से चारों ओर डाल कहते हैं कि चलो:
data Silly t errorT = Silly t errorT
instance Functor Silly -- oh no we can't do this without a newtype wrapper
जबकि
instance MultiFunctor (Silly t errorT) t
ठीक काम करता है और
instance MonoFunctor (Silly t errorT)
type instance Element (Silly t errorT) t
भी अच्छा है।
टाइप क्लास परिभाषाओं में केवल पूर्ण प्रकार (हस्ताक्षर टाइप नहीं) का उपयोग करने के इन लचीलेपन फायदे को देखते हुए, क्या मूल शैली परिभाषा का उपयोग करने का कोई कारण है, मानते हुए कि आप जीएचसी का उपयोग कर रहे हैं और एक्सटेंशन का उपयोग नहीं करते हैं? यही है, क्या कोई विशेष चीज है जिसे आप एक प्रकार का कन्स्ट्रक्टर डालने में कर सकते हैं, न सिर्फ एक प्रकार के वर्ग में एक पूर्ण प्रकार जिसे आप बहु-पैरामीटर प्रकार कक्षाओं के साथ नहीं कर सकते हैं या परिवार टाइप कर सकते हैं?
क्या आप परंपरागत दृष्टिकोण का उपयोग कर लेंस के बारे में और अधिक समझा सकते हैं, विशेष रूप से टाइप परिवारों के साथ क्या हासिल नहीं किया जा सकता है, शायद एक साधारण उदाहरण के साथ? – Clinton
@ क्लिंटन: मैंने इसके बारे में सोचा; 'लेंस' _could_ शायद' * -> * -> बाधा 'फंक्चर क्लास के साथ व्यक्त किया जा सकता है (यद्यपि बल्कि अधिक अजीब तरह से)। मैंने एक अलग उदाहरण जोड़ा। – leftaroundabout