तरीके इस धारणात्मक करना है, के बहुत सारे हैं। दुर्भाग्यवश, उनमें से अधिकतर वास्तव में काम नहीं करते हैं। अफसोस!
सबसे पहले, एक कार्यात्मक प्रोग्रामर के रूप में, मैं दांव लगाना चाहते यह है कि क्या आप वास्तव में लिखना चाहते हैं:
instance Listable (\a -> (a, a)) where
asList (p, q) = [p,q]
दुर्भाग्य से टाइप स्तरीय lambdas मौजूद नहीं हैं। ,
type Same2 f a = f a a
instance Listable (Same2 (,)) where { ... }
कि या तो अनुमति नहीं है क्योंकि प्रकार पर्याय पूरी तरह से लागू नहीं किया है: हम ऊपर लैम्ब्डा एक प्रकार पर्याय उपयोग करने का एक नामित संस्करण लिख सकते हैं। हम बजाय एक अतिरिक्त तर्क यह है कि वर्णन होगा कैसे प्रकार चर लागू करने के लिए ले जा रहा प्रकार वर्ग कल्पना कर सकता: यहां तक कि क्या app
हो सकता है के बारे में सोच के बिना
class Listable app f where
asList :: app f a -> [a]
instance Listable __ Maybe where { ... }
instance Listable __ (,) where { ... }
, यह भी विफल रहता है क्योंकि हम के लिए एक सुसंगत तरह की जरूरत नहीं है f
पैरामीटर।
वास्तव में काम करने वाली चीज़ों पर आगे बढ़ना, मुझे लगता है कि newtype
के अंदर प्रकार समानार्थी दृष्टिकोण को लपेटना सबसे आम तरीका है, फिर केवल रैपिंग और अनैपिंग के साथ सौदा करें।
newtype Same2 f a = Same2 (f a a)
instance Listable (Same2 (,)) where { ... }
यह थोड़ा बदसूरत है, तो यह काम करने योग्य है। आप इस तरह के कन्स्ट्रक्टर संरचना और अन्य खिलौने को इस प्रकार परिभाषित भी कर सकते हैं, फिर हूप-कूदिंग बॉयलरप्लेट के ढेर के नीचे दफन किए गए टाइप-स्तरीय पॉइंट-मुक्त अभिव्यक्तियों के साथ पागल हो जाएं।
एक अंतिम दृष्टिकोण के रूप में, आप भी "रिवर्स में" ऊपर लैम्ब्डा शैली दृष्टिकोण सांकेतिक शब्दों में बदलना कर सकते हैं, से जा रहा पूरी तरह से लागू किया संस्करण, एक प्रकार पैरामीटर के लिए:
class Listable t where
type ListableElem t :: *
asList :: t -> [ListableElem t]
होने के नाते इस प्रकार की चीज करने में सक्षम परिवारों के प्रकार के लिए मुख्य प्रेरणा है। एमपीटीसी और फंडप के साथ भी यही बात व्यक्त की जा सकती है, लेकिन यह 1) समतुल्य और 2) बहुत अधिक है, इसलिए मैं इसे लिखने से परेशान नहीं करूंगा।
इसे आज़माने के लिए आलसी होने के लिए खेद है, लेकिन अंतिम दृष्टिकोण 'इंस्टेंस लिस्टेबल (ए, ए)' की अनुमति देगा - है ना? – yatima2975
@ yatima2975: बाहरी उदाहरण के रूप में '(,) 'के साथ अलग-अलग उदाहरण होने की कीमत पर, हां। शायद इसे मेरे उत्तर में एक उदाहरण के रूप में रखना चाहिए था, अब आप इसका जिक्र करते हैं ... –