/ / क्लास डिक्लेरेशन में हास्केल अप्रत्याशित प्रकार - क्लास, हैस्केल

कक्षा घोषणा में हास्केल अप्रत्याशित प्रकार - कक्षा, हैकेल

मैं एक फंक्शन (ट्री ए) -> (ट्री ए) -> (ट्री ए) लागू करने की कोशिश करता हूं। फ़ंक्शन को नोड मानों को योग करना चाहिए और एक पेड़ को रकम के साथ वापस करना चाहिए। Unfortunatley मैं निम्नलिखित त्रुटि संदेश मिला:

Aufgabe10.hs: 4: 11: अप्रत्याशित प्रकार expected ट्री ए ’ कक्षा में ation + के लिए घोषणा एक वर्ग की घोषणा के लिए फार्म होना चाहिए क्लास + ए बी सी जहां ...

यह मेरा कोड है:

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

class (+) (Tree a) where
(+) :: (Tree a) (Tree a) -> (Tree a)

instance (Num a) => (+) (Tree a) (Tree a) where
(+) (Node a1 b1 c1)  (Node a2 b2 c2) = (Node (a1+a2) ((+) b1 b2)  ((+) c1 c2))
(+) Empty (Node a b c) = (Node a b c)
(+) (Node a b c) Empty = (Node a b c)

ठीक है, मैंने अब क्लास को प्लस में बदल दिया और फ़ंक्शन प्लस नाम दिया, क्योंकि मैं सभी सुन्न कार्यों को लागू नहीं करना चाहता हूं। यह नया कोड है:

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

class Plus a where
plus:: (Tree a)  -> (Tree a)  -> (Tree a)

instance (Num a) => Plus (Tree a) where
Plus (Node a1 b1 c1)  (Node a2 b2 c2) = (Node (a1+a2) (Plus b1 b2)  (Plus c1 c2))
Plus Empty (Node a b c) = (Node a b c)
Plus (Node a b c) Empty = (Node a b c)

मुझे निम्न त्रुटियां मिलती हैं:

Aufgabe10.hs: 8: 9: उदाहरणों की घोषणाओं में पैटर्न बाइंडिंग (सरल चर को छोड़कर) की अनुमति नहीं है प्लस (नोड एन 1 बी 1 सी 1) (नोड 2 बी 2 सी 2) = (नोड (a1 + a2) (प्लस b1 b2) (प्लस c1 c2)

Aufgabe10.hs: 9: 9: उदाहरणों की घोषणाओं में पैटर्न बाइंडिंग (सरल चर को छोड़कर) की अनुमति नहीं है प्लस खाली (Node a b c) = (Node a b c)

Aufgabe10.hs: 10: 9: उदाहरणों की घोषणाओं में पैटर्न बाइंडिंग (सरल चर को छोड़कर) की अनुमति नहीं है प्लस (नोड ए बी सी) खाली = (नोड ए बी सी)

उत्तर:

जवाब के लिए 2 № 1

पर एक नज़र डालें टाइपसेकल्स क्या हैं?: वहाँ आप नोटिस है कि typeclasses घोषणा लेता है:

  1. टाइपकास्ट नाम;
  2. एक प्रकार चर।

इसलिए, आपकी घोषणा के रूप में शुरू होना चाहिए

class (+) a where

नहीं

class (+) (Tree a) where

हालांकि मैं पसंद करूंगा

class Plus a where

जो आपकी समस्याओं को हल करता है। :)


आपके अद्यतन संस्करण का उत्तर दे रहा है ...

क्या आपको इसमें अंतर दिखाई देता है Plus तथा plus? हां, एक पूंजीकृत है और दूसरा नहीं है। क्या आप जानते हैं कि हास्केल में इसका क्या मतलब है?

Plus, हास्केल में हर बड़े शब्द के रूप में, संदर्भित करता है प्रकार (इस मामले में, वर्ग टाइप करें बुलाया Plus)।

दूसरी ओर, फ़ंक्शंस हमेशा कम होना चाहिए - और यही कारण है कि आपने परिभाषित किया है plus :: (Tree a) -> (Tree a) -> (Tree a) लोअरकेस में।

क्या आपने अपनी समस्या पहले ही पकड़ ली है?

के बजाय

instance (Num a) => Plus (Tree a) where
Plus (Node a1 b1 c1)  (Node a2 b2 c2) = (Node (a1+a2) (Plus b1 b2)  (Plus c1 c2))
Plus Empty (Node a b c) = (Node a b c)
Plus (Node a b c) Empty = (Node a b c)

आपको लिखना चाहिए था

instance (Num a) => Plus (Tree a) where
plus (Node a1 b1 c1)  (Node a2 b2 c2) = (Node (a1+a2) (Plus b1 b2)  (Plus c1 c2))
plus Empty (Node a b c) = (Node a b c)
plus (Node a b c) Empty = (Node a b c)

क्योंकि आप फ़ंक्शन के व्यवहार को परिभाषित कर रहे हैं plus कब Tree का एक उदाहरण है Plus। समझ गया? :)