2011-07-07 9 views
6

अध्याय 3 एक द्विआधारी पेड़ का प्रतिनिधित्व करने के लिए निम्न पुनरावर्ती प्रकार परिभाषित करता है:असली दुनिया हास्केल अध्याय 3 अभ्यास: के साथ बाइनरी ट्री 1 मूल्य निर्माता

data Tree a = Node a (Tree a) (Tree a) 
      | Empty 
       deriving (Show) 

व्यायाम मैं एक ही मूल्य निर्माता का उपयोग कर एक ही प्रकार लागू की आवश्यकता है, खाली की

(अध्याय 3 व्यायाम 2 पेज 60 पर से) "एक पेड़ प्रकार हमारे जावा उदाहरण की तरह केवल एक निर्माता है, को परिभाषित करने के बजाय:" शायद "प्रकार का उपयोग बच्चे नोड्स का उल्लेख करने के। कन्स्ट्रक्टर, शायद प्रकार के रेफरी का उपयोग करें एक नोड के बच्चों के लिए आर। "

data AltTree a = AltNode a (Maybe (AltTree a)) (Maybe (AltTree a)) 
       deriving (Show) 

बहरहाल, यह एक पेड़ जैसे अन्य खाली पेड़, शामिल करने के लिए अनुमति नहीं देता::

समाधान मैं के साथ आया था निम्नलिखित है

AltNode 1 (AltNode 2 Nothing Nothing) (AltNode 3 Nothing Nothing) 

और मैं नहीं कर रहा हूँ निश्चित रूप से, "शायद" प्रकार के लिए "कुछ नहीं" मूल्य कन्स्ट्रक्टर क्यों नहीं है?

+0

ऑनलाइन: [आरडब्ल्यूएच> अध्याय 3> व्यायाम] (http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id585938) –

उत्तर

5

यह Nothing वैल्यू कन्स्ट्रक्टर नहीं है जो आपकी त्रुटि का कारण बनता है। आप शीर्ष-स्तरीय पेड़ में जाने वाली दो शाखाएं Maybe (AltTree a) टाइप करनी चाहिए, लेकिन (AltNode 2 Nothing Nothing) और (AltNode 3 Nothing Nothing) दोनों AltTree Int टाइप करें। Maybe उनके मानों को बनाने के लिए आपको Just वैल्यू कन्स्ट्रक्टर का उपयोग करना होगा। जैसा

AltNode 1 (Just (AltNode 2 Nothing Nothing)) (Just (AltNode 3 Nothing Nothing)) 
+3

@rr इसके अलावा, समाधान है अधूरा - आपके पास 'खाली' के बराबर नहीं है। आपको 'AltNode कुछ भी नहीं कुछ भी' अनुमति देने की आवश्यकता है। यह अभी भी सही नहीं है, क्योंकि अब टाइप सिस्टम खाली नोड्स को अनुमति दे सकता है जिनमें बच्चे हैं। शायद सभी तर्कों को एक शायद टुपल में लपेटना अर्थपूर्ण रूप से बेहतर होगा? –

+0

@ मताजोन, स्पष्टीकरण के लिए धन्यवाद, जो अब समझ में आता है। लेकिन क्या यह पुस्तक को उनके द्वारा दिए गए कार्यान्वयन से भिन्न नहीं बनाता है? या शायद मैं इसे बहुत ज्यादा पढ़ रहा हूं। –

+0

@ थॉमस एम। डुबुइसन यह एक अच्छा मुद्दा है, मुझे पूरी तरह से यकीन नहीं है, मुझे इसके साथ खेलना होगा। धन्यवाद। –

संबंधित मुद्दे