2011-07-07 15 views
6

Rozdział 3 określa następujące rekurencyjną typ reprezentowania binarnego drzewa:Real World Haskell Rozdział 3 ćwiczenia: drzewo binarne z 1 wartość konstruktor

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

Ćwiczenie wymaga zaimplementować ten sam typ używając konstruktora pojedyncza wartość, przy użyciu typu „może” w odniesieniu do węzłów potomnych:

(z rozdziału 3 Ćwiczenie 2 na stronie 60)

„Określ typ drzewa, który ma tylko jeden konstruktor, jak naszym przykładzie Java Zamiast pustego. konstruktor, użyj typu Maybe w refe r do dzieci węzła. "

Rozwiązanie wymyśliłem jest następujący:

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

to jednak nie pozwala na drzewie zawierającym inne pustych drzew, takich jak:

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

I nie jestem dlaczego "Czy nic" nie jest konstruktorem wartości typu "Być może"?

+0

Online: [RWH> Rozdział 3> Ćwiczenia] (http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id585938) –

Odpowiedz

5

To nie jest konstruktor wartości Nothing, który powoduje błąd. Dwie rozgałęzione gałęzie do drzewa najwyższego poziomu powinny mieć typ Maybe (AltTree a), ale oba typy: (AltNode 2 Nothing Nothing) i (AltNode 3 Nothing Nothing) mają typ AltTree Int. Musisz użyć konstruktora wartości Just, aby utworzyć z nich wartości typu Maybe. Jak

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

@rr Ponadto rozwiązanie niekompletne - nie masz odpowiednika dla opcji "Opróżnij". Musisz zezwolić na 'AltNode Nothing Nothing Nothing'. To wciąż nie jest w porządku, ponieważ teraz system typów może zezwalać na puste węzły, które mają dzieci. Być może zawarcie wszystkich argumentów w tupie Być może będzie semantycznie lepsze? –

+0

@Matajon, dzięki za wyjaśnienie, które ma teraz sens. Ale czy to nie różni tego typu od implementacji, którą dają w książce? A może za dużo tego czytam. –

+0

@Thomas M. DuBuisson To dobry punkt, nie jestem do końca pewien, będę musiał się z tym bawić. Dzięki. –