haskell - How to create instances for phantom types returning phantom type? -


इसमें निम्न डेटा प्रकार हैं:

  डेटा Foo1 a = Foo1 डेटा Foo2 a = Foo2 (Foo3 ए) डेटा Foo3 a = C1 (Foo1 ए) | C2 Int  

और अब हम Foo1 या Int से Foo3 प्राप्त करने में सक्षम होना चाहते हैं। एक प्रकार एक वर्ग का उपयोग करने का समाधान हो सकता है:

  वर्ग ToFoo3 a to tofoo3 :: a - & gt; Foo3 b - यहाँ इस प्रेत प्रकार b ... उदाहरण ToFoo3 (Foo1 b) के साथ समस्याएं शुरू करें जहां toFoo3 foo1 = C1 foo1 उदाहरण ToFoo3 Int जहां toFoo3 int = C2 int  

और यहां कंपाइलर शिकायत करता है (सही!) कि वह बी 1 के साथ बी मैच नहीं कर सकता क्योंकि क्लास की परिभाषा में "बी" की संख्या Foo1 में से एक के समान नहीं है।

क्या कोई तरीका है

  {- # LANGUAGE MultiParamTypeClasses # -} {- # भाषा फ्लेक्सिबल इंस्टेंस # -} डेटा Foo1 a = Foo1 डेटा Foo2 a = Foo2 (Foo3 ए) डेटा Foo3 a = C1 (Foo1 ए) | सी 2 इट क्लास ToFoo3 a b जहां toFoo3 :: a - & gt; Foo3 b उदाहरण ToFoo3 (Foo1 b) b to tofoo3 foo1 = C1 foo1 उदाहरण ToFoo3 Int b जहां toFoo3 int = C2 int  

जिस तरह से मैं इसे समझता हूं, आप में कोई फ़ंक्शनल निर्भरता नहीं हो सकती किसी भी Foo3 a प्रकार, और Foo1 a भी की जरूरतों को परिवर्तित करने में सक्षम होने की आवश्यकता होने के कारण, Int एक ही Foo3 a प्रकार में परिवर्तित करने में सक्षम होने के लिए।

बेशक इसका मतलब है कि आप toFoo3 के किसी भी तर्क या परिणाम प्रकार की उम्मीद नहीं कर सकते दूसरे को अव्यवस्था करने में मदद करें, इसलिए आपको इसे इस्तेमाल करने के लिए कभी-कभी टाइपिंग एनोटेशन की परेशानी की आवश्यकता हो सकती है, लेकिन इसके अलावा यह काम करना चाहिए।

संपादित करें: मैं आपको मानता हूँ नहीं < Em> को Foo1 a से Foo3 b के साथ a और b अलग से परिवर्तित करने में सक्षम होना चाहते हैं। अगर मैं इसके बारे में गलत हूं, तो एक पैरामीटर वर्ग के साथ आपके ओपी कोड को काम करना चाहिए यदि आप एक उदाहरण को

  उदाहरण ToFoo3 (Foo1b) में बदलते हैं जहां toFoo3 Foo1 = C1 Foo1  

Comments