2012-09-21 40 views
9

में शो का एक उदाहरण टाइप करना मैं निम्नलिखित डेटा प्रकार Show का एक उदाहरण बनाने की जरूरत है:एक डेटा हास्केल

data Tree a b = Branch b (Tree a b) (Tree a b) | Leaf a 

मैं काफी इस पर नया हूँ, लेकिन साथ शुरू करने के लिए, मैं इस घोषणा में व्याख्या की

"हमने ट्री नामक एक नया प्रकार बनाया है, जिसे प्रकार ए और बी के साथ पैरामीटर किया गया है। एक पेड़ दो चीजों में से एक हो सकता है: एक शाखा जिसमें प्रकार बी के डेटा का एक टुकड़ा होता है, साथ ही दो और पेड़, या एक पत्ता जिसमें एक प्रकार का डेटा आइटम होता है। "

अब, मुझे deriving का उपयोग किये बिना, इसे अच्छी तरह से (नेस्टेड शाखाएं, आदि) "दिखाने" का एक तरीका बनाने की आवश्यकता है। अब तक, मैं केवल एक मॉड्यूल में कार्यों को लिख रहा हूं और एक दुभाषिया खिड़की में उनके साथ लोड/खेल रहा हूं, इसलिए मैंने वास्तव में कन्स्ट्रक्टर आदि के साथ चीजें नहीं की हैं। फिर भी, मुझे लगा कि मैं अपनी फाइल के भीतर पेड़ डेटा प्रकार की घोषणा करके बस शुरू कर सकता हूं, जैसा कि प्रश्न की शुरुआत में दिखाया गया है, और वहां से जाना है।

जैसा कि मैंने ज्यादा सफलता के बिना के साथ "शो" चारों ओर गड़बड़ है, मैं शायद सोचा था कि मैं पेड़ की एक छोटी घटक और कैसे परिभाषित करने के लिए की जरूरत है "दिखाएँ" यह पहली बार पूरे वृक्ष के साथ काम करने की कोशिश कर रहा से पहले:

data Leaf a = Leaf a 

instance Show (Leaf a) where 
show (Leaf a) = ??? 

मैंने कई चीजों की कोशिश की ??? स्थान, जैसे कि "एक" के रूप में, बस एक अपने आप में, putStrLn, आदि, लेकिन कोई भी बाहर एक का मूल्य मुद्रण जब मैं कहता हूँ

>show (Leaf 3) 

वास्तव में की तरह कुछ है, मैं कई मामलों में इस का सामना करना पड़ा है कर रहे हैं, जो शायद मतलब है मैं चीजों को सही पता लगाने नहीं हूं:

Ambiguous occurrence `show' 
    It could refer to either `Main.show', defined at a2.hs:125:1 
          or `Prelude.show', 
          imported from `Prelude' at a2.hs:2:8-11 
          (and originally defined in `GHC.Show') 

... जो मैं "Main.show," जो निश्चित रूप से काम नहीं करता है फोन करके संबोधित किया।

मुझे लगता है कि सवाल यह है कि, मैं यह सब कहां से जाऊं ... या शायद बस, "मैं पत्ता कैसे ठीक कर सकता हूं" दिखाएं "उपयोगिता ताकि मैं इसे विस्तारित कर सकूं?" (मान लीजिए कि मुझे इसे पहले परिभाषित करना है ...)

उत्तर

20

आप ऐसे ही शुरू कर दिया है showTree a b आपको पहले showa एस और b एस करने में सक्षम होना चाहिए। (Show a, Show b) => भाग यही है, यह आपके उदाहरण के लिए आवश्यक पूर्व शर्त निर्दिष्ट करता है।

data Tree a b = Branch b (Tree a b) (Tree a b) | Leaf a deriving Show 

लेकिन कहते हैं कि प्रपत्र आप चाहते हैं की आप उत्पादन नहीं देता है:

1

आपका डेटा-प्रकार deriving Show के लिए एक आदर्श उम्मीदवार है।

data Tree a b = Branch b (Tree a b) (Tree a b) | Leaf a deriving Show 

यह स्वचालित रूप से आपके लिए शो उदाहरण उत्पन्न करेगा।

यदि आप शो का मैन्युअल उदाहरण बनाना चाहते हैं, तो यहां विचार प्रक्रिया है।

सबसे पहले, बुनियादी कंकाल:

instance Show (Tree a b) where 
    -- show :: Tree a b -> String 
    show (Branch b ltree rtree) = {- some string -} 
    show (Leaf a) = {- some string -} 

अब हम जानते हैं कि हम किसी तरह प्रकार a और b तारों के रूप में के मूल्यों को दिखाने के लिए की आवश्यकता होगी। बेशक, इसका मतलब है कि हमें सीधे उन पर show पर कॉल करने में सक्षम होना चाहिए, इसलिए a और b में शो के उदाहरण होना चाहिए।यहाँ है कि कैसे हुआ है:

instance (Show a, Show b) => Show (Tree a b) where 
    -- show :: Tree a b -> String 
    show (Branch b ltree rtree) = {- some string -} 
    show (Leaf a) = {- some string -} 

तो यह सिर्फ इस तरह के रूप में उपयुक्त तार, के साथ रिक्त स्थान को भरने के लिए:

data Tree a b = Branch b (Tree a b) (Tree a b) | Leaf a 

instance (Show a, Show b) => Show (Tree a b) where 
    show (Leaf x) = show x 
    show (Branch p l r) = ??? 

आदेश में करने के लिए:

instance (Show a, Show b) => Show (Tree a b) where 
    -- show :: Tree a b -> String 
    show (Branch b ltree rtree) = "((" ++ show ltree ++ ") <-- (" ++ b ++ ") --> (" ++ show rtree ++ "))" 
    show (Leaf a) = "L " ++ show a 
5

सबसे आसान जवाब स्वचालित रूप से एक Show उदाहरण प्राप्त करने के लिए किया जाएगा। आप अपने खुद के Show उदाहरण परिभाषित करने के लिए चाहते हैं, आप की तरह कुछ करने चाहते हैं:

instance (Show a, Show b) => Show (Tree a b) where 
    show (Leaf a) = "Leaf " ++ (show a) 
    show (Branch b l r) = "Branch " ++ (show b) ++ " { " ++ l ++ ", " ++ r " }" 

जिस तरह से आप कि पहले लाइन पढ़ सकता है, "a दिया और bShow typeclass के दोनों घटनाएं होती हैं, Tree a b भी है Show टाइपक्लास का एक उदाहरण ... "

वैसे, इंडेंटेशन महत्वपूर्ण है। यह आपके द्वारा चिपकाए गए स्निपेट में उलझा हुआ हो सकता है, लेकिन आपको घोषणा के तहत show फ़ंक्शन परिभाषाओं को इंडेंट करना होगा।

8

यहाँ एक छोटी सी संकेत है:

instance Show (Leaf a) where 
show (Leaf a) = ??? 

लिखकर क्या आप वास्तव में था एक खालीShow उदाहरण, एक शीर्ष स्तर show समारोह के बाद परिभाषित किया गया था। यही कारण है कि आपको "संदिग्ध show" त्रुटि मिलती है; आपने एक नया show फ़ंक्शन परिभाषित किया है, जिसका नाम मौजूदा के साथ संघर्ष करता है।

आप क्या मतलब कहना था

instance Show (Leaf a) where 
    show (Leaf a) = ??? 

नोट कैसे दूसरी पंक्ति अब दांतेदार है। इसका अर्थ यह है कि आप मौजूदा show विधि को फिर से परिभाषित कर रहे हैं, जैसा कि संभवतः आप इरादा रखते हैं।