2016-03-20 22 views
0

in Haskell ich Dinge tun kann wieHaskell, die einen Baum

a :: Int 
a = 15 

ich den Datentyp wie unten

data Btree a = ND | Data a | Branch (Btree a) (Btree a) deriving (Show, Eq) 

habe Wie kann ich einen Baum definieren, keine Funktion, wie oben mit .

Ich habe es versucht;

tree :: BTree 
tree = Branch Btree (Branch ND Data 1) (Branch ND (Branch ND ND)) 

Ich kann nicht scheinen, um es zu bekommen zu arbeiten (ich bin hier so Haskell, wenn diese sehr einfach ich im Voraus entschuldigen)

Antwort

3

Beachten Sie, dass eine Instanz der Daten zu konstruieren, geben Sie brauchen um eine seiner Konstruktorfunktionen aufzurufen. Alle diese Konstruktoren, ND, Data, Branch, sind nur normale Funktionen, also sollten Sie sie so nennen. In Ihrer tree mischen Sie Datentypen (Btree) mit Konstruktoren, während Sie nur Konstruktoren verwenden sollten. Beachten Sie auch, dass der Funktionsaufruf (der 'Raumoperator' ist linksbündig) sehr gierig ist. Daher ruft Branch ND Data 1 die Funktion Branch mit 3 Argumenten auf, anstatt wie gewünscht: Branch ND (Data 1).

So Ihrem Baum der Tiefe zu erstellen 2 Unter Berücksichtigung der oben schreiben Sie:

tree = Branch (Branch ND (Data 1)) (Branch ND (Branch ND ND)) 
2

Beachten Sie, dass Data 1 wird auch ohne zusätzliches Gepäck

Prelude> :t (Data 1) 
(Data 1) :: Num a => Btree a 

ein Btree sein, wenn Sie eine einfache wollen Zweig mit einem rechten Element nur können Sie schreiben

Branch ND (Data 1) 

oder zwei Ebenen d wie in der anderen Antwort. An dieser Stelle sind praktische Konstruktorfunktionen nützlich, um Rauschen und Tippfehler zu minimieren.