मैं एक "रैखिक" प्रकार परिवार मिल गया है, प्रपत्रinverting एक प्रकार परिवार
type family Foo a
type instance Foo T1 = T2
type instance Foo T2 = T3
...
type instance Foo T9 = T10
मेरी particualr उपयोग-मामले में की यानी, यह बहुत सुविधाजनक परिभाषित करने के लिए है "रिवर्स" परिवार FooRev
और उसके बाद बाधा (FooRev (Foo x) ~ x)
लागू:
type family FooRev a
type instance FooRev T10 = T9
type instance FooRev T9 = T8
...
type instance FooRev T2 = T1
रिवर्स परिवार GHC कई प्रकार है कि अन्यथा गैर injectivity के कारण अस्पष्ट होगा अनुमान लगाने के लिए अनुमति देता है। यह अनिवार्य रूप से वही विचार है जिसे प्रस्तावित किया गया था here। यह समाधान बहुत अच्छी तरह से काम करता है, लेकिन यह सभी मामलों को सूचीबद्ध करके "रिवर्स" प्रकार परिवार को परिभाषित करने के लिए परेशान, प्रोग्रामिक और त्रुटि-प्रवण है। क्या Foo
जैसे रैखिक परिवार के विपरीत को परिभाषित करने का एक और सामान्य तरीका है?
शायद आप किसी भी तरह से 'डेटा' परिवारों का उपयोग कर सकते हैं, जो इंजेक्शन के रूप में जाना जाता है। सुनिश्चित नहीं है कि यह आपकी समस्या के अनुरूप है या नहीं। – luqui
मेटाप्रोग्रामिंग (यानी टेम्पलेट हास्केल) आपकी कोड को डीआरवाई रखने के लिए दोनों उत्पन्न कर सकता है यदि यह आपकी चिंता है। अन्यथा, आप एक प्रकार-स्तरीय एसोसिएशन सूची, एक प्रकार का स्तर लुकअप, एक प्रकार का स्तर 'नक्शा स्वैप' परिभाषित कर सकते हैं, और सूची से दोनों प्रकार के परिवारों को प्राप्त कर सकते हैं। – chi
@luqui मैंने अभी देखा है कि पोस्ट करने से पहले, लेकिन जहां तक मुझे पता है, यह वास्तव में मुझे नहीं चाहिए। मेरे मामले में, 'टीआई' सभी प्रकार 'बार ए बी सी' हैं जहां टाइप पैरामीटर बदलते हैं। वह एक डेटा परिवार में फिट नहीं होगा, है ना? – crockeea