मुझे लगता है कि यहां तनाव में कुछ तत्व हैं। सामान्य विचार है कि वर्ग परिभाषाओं को न्यूनतम होना चाहिए, और केवल स्वतंत्र फ़ंक्शंस होना चाहिए।bhelkir के जवाब बताते हैं, अपने वर्ग कार्यों a
, b
और c
, लेकिन c
a
और b
के मामले में लागू किया जा सकता का समर्थन करता है तो उस वर्ग के c
बाहर परिभाषित करने के लिए एक तर्क है।
लेकिन यह सामान्य विचार कुछ अन्य विरोधाभासी मुद्दों में चलता है।
सबसे पहले, अक्सर एक से अधिक न्यूनतम संचालन सेट होते हैं जो समान कक्षा को समान रूप से परिभाषित कर सकते हैं। हास्केल में Monad
की क्लासिक परिभाषा इस (एक सा साफ) है:
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
लेकिन यह अच्छी तरह से जाना जाता है वहां वैकल्पिक परिभाषा, की तरह हैं कि यह एक:
class Applicative m => Monad m where
join :: m (m a) -> m a
return
और >>=
के लिए पर्याप्त हैं join
लागू करें, लेकिन fmap
, pure
और join
>>=
को लागू करने के लिए भी पर्याप्त हैं।
Applicative
के साथ एक समान चीज़। यह विहित हास्केल परिभाषा है:
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
लेकिन इनमें से कोई भी बराबर है:
class Functor f => Applicative f where
unit :: f()
(<*>) :: f (a -> b) -> f a -> f b
class Functor f => Applicative f where
pure :: a -> f a
fpair :: f a -> f b -> f (a, b)
class Functor f => Applicative f where
unit :: f()
fpair :: f a -> f b -> f (a, b)
class Functor f => Applicative f where
unit :: f()
liftA2 :: (a -> b -> c) -> f a -> f b -> f c
इन वर्ग परिभाषाओं में से किसी को देखते हुए, आप एक के रूप में दूसरों से किसी में से किसी भी विधि लिख सकते हैं वर्ग के बाहर व्युत्पन्न कार्य। पहला क्यों चुना गया था? मैं आधिकारिक रूप से जवाब नहीं दे सकता, लेकिन मुझे लगता है कि यह हमें तीसरे बिंदु पर लाता है: प्रदर्शन विचार। fpair
उनमें से कई में f a
और f b
मूल्यों को टुपल्स बनाकर जोड़ता है, लेकिन Applicative
कक्षा के अधिकांश उपयोगों के लिए हम वास्तव में उन tuples को नहीं चाहते हैं, हम सिर्फ f a
और f b
से खींचे गए मानों को जोड़ना चाहते हैं; कैननिकल परिभाषा हमें यह चुनने की अनुमति देती है कि इस संयोजन को किस संयोजन के साथ किया जाए।
एक अन्य प्रदर्शन विचार यह है कि यदि कक्षा में कुछ विधियां दूसरों के संदर्भ में निश्चित हो सकती हैं, तो ये सामान्य परिभाषा कक्षा के सभी उदाहरणों के लिए अनुकूल नहीं हो सकती है। यदि हम उदाहरण के रूप में Foldable
लेते हैं, foldMap
और foldr
अंतर-भिन्न हैं, लेकिन कुछ प्रकार दूसरे की तुलना में एक और अधिक कुशलता से समर्थन करते हैं। अक्सर हमारे पास गैर-न्यूनतम श्रेणी परिभाषाएं होती हैं ताकि उदाहरणों को विधियों के अनुकूलित कार्यान्वयन प्रदान किए जा सकें।
मामूली क्विबल: '<,>' कानूनी ऑपरेटर नाम नहीं है। –
@ ØrjanJohansen: डी ओह! मैंने इसे 'fpair' में बदल दिया (नाम बनाया,' fmap' के समानता का थोड़ा सा)। –
न्यूनतम कक्षाओं को न्यूनतम इंटरफ़ेस के आधार पर न्यूनतम परिवर्धन के लिए डिफ़ॉल्ट कार्यान्वयन के दौरान न्यूनतम वर्गों को रखने का क्या फायदा है? – timdiels