हास्केल में, ऐसा कहा जाता है कि किसी भी एडीटी को उत्पादों के योग के रूप में व्यक्त किया जा सकता है। मैं एक फ्लैट प्रकार खोजने की कोशिश कर रहा हूं जो Tree
पर Data.Tree
पर isomorphic है।किसी प्रकार को कैसे लिखना है जो बिना किसी सूचियों के पेड़ के आइसोमोर्फिक है?
Tree a = Node a [Tree a] -- has a nested type (List!)
मैं नेस्ट प्रकार के बिना पेड़ के लिए एक कार्यात्मक रूप से समान परिभाषा लिखना चाहते हैं:
Tree = ??? -- no nested types allowed
कि के लिए, मैं प्रकार अल्जेब्रास के लिए पुनरावर्ती संबंध में लिख करने की कोशिश की:
L a = 1 + a * L a
T a = a * L (T a)
इनलाइनिंग एल, मेरे पास था:
T a = a * (1 + T a * L (T a))
T a = a * (1 * T a * (1 + T a * L (T a)))
T a = a * (1 + T a * (1 + T a * (1 + T a * L (T a))))
,210
कहीं नहीं जा रहा था कि, तो मैं बंद कर दिया और किया गुणा, मेरे साथ छोड़ रहा है:
T a = a + a * T a + a * T a * T a ...
कौन सा ही है के रूप में:
T a = a * (T a)^0 + a * (T a)^1 + a * (T a)^2 ...
उत्पादों की राशि है, लेकिन यह अनंत है मैं इसे हास्केल में नहीं लिख सकता। बीजगणित कोस द्वारा:
(T a) - (T a)^2 = a * T a
- (T a)^2 - a * T a + (T a) = 0
T a
के लिए हल करने पर मैंने पाया कि:
T a = 1 - a
कौन सा स्पष्ट रूप से कोई मतलब नहीं है। तो, मूल प्रश्न पर वापस जाएं: Data.Tree
से Tree
को कैसे फ़्लैट कर सकता हूं ताकि मैं एक प्रकार लिख सकूं जो बिना घोंसले वाले आइसोमोर्फिक है?
यह प्रश्न my previous question का डुप्लिकेट नहीं है। आखिरी वाला स्कॉट एन्कोडिंग के साथ नेस्टेड प्रकारों का प्रतिनिधित्व करने के बारे में है, जिसके लिए सही जवाब "घोंसले को अनदेखा" है। यह पूछने के लिए आगे बढ़ता है कि किसी नेस्टेड प्रकार को कैसे फ़्लैट करना है (क्योंकि स्कॉट एन्कोडिंग के किसी विशेष उपयोग के लिए इसकी आवश्यकता है, लेकिन सामान्य रूप से अनिवार्य नहीं है)।
हालांकि मुझे लगता है कि मुझे पता है कि आप क्या चाहते हैं (और शायद रीड पहले से ही * हल * यह) आप कर सकते हैं कृपया: निर्माता, आप उनमें से प्रत्येक बस सूचियों से एक के लिए एक आइटम जोड़ने के लिए एक निर्माता दे सकते हैं एक * फ्लैट * डेटा संरचना के तहत आप क्या समझते हैं? (क्योंकि आपको लगता है कि * रिकर्सन * जो मुझे आश्चर्यजनक लगता है) – Carsten
विशेष रूप से, मैं चाहता हूं कि यह बाध्य चर पर, हां, संभवतः रिकर्सन के साथ उत्पादों के योग के रूप में व्यक्त किया जा सके। पूर्व: 'डेटा रिक ए = ए ए (रिक ए) | बी ए ए ए ए | सी ए (रिक ए) ए | डी ए ', पूरी तरह से मान्य है। लेकिन एक और रिकर्सिव प्रक्रिया (जैसे '[वृक्ष ए]' पर पुनरावृत्ति ठीक नहीं है। मैं विशेष रूप से चाहता हूं क्योंकि मैं स्कॉट एन्कोडिंग का उपयोग करके लैम्ब्डा कैलकुस पर हास्केल डेटाटाइप को एन्कोड कर रहा हूं, जो नेस्टेड प्रकारों के लिए जिम्मेदार नहीं है, इसलिए मुझे किसी भी तरह घोंसले के बिना ऐसा करना है। स्कॉट एन्कोडिंग के लिए – MaiaVictor
@ विकिलिब 'ट्री' मेरे लिए समस्याग्रस्त प्रतीत नहीं होता है। [यह] (http://lpaste.net/134093) काम नहीं करना चाहिए? –