2017-08-14 51 views
1

大家好,這是我的第一個問題,我是Haskell的新手,我需要做一個Haskell函數,它需要一個樹並返回其節點中的元素列表中的一個預先遍歷但我無法讓它工作。樹與Haskell遍歷

我的樹定義如下:

data Tree a = Node a [Tree a] deriving Show 

和預購功能是:

preorderTree :: Tree a -> [a] 
preorderTree Empty = [] 
preorderTree (Node a l r) = a : (preorderTree l) ++ (preorderTree r) 

在事先非常感謝你的幫助:)

+5

嗯,你已經寫了'Node'採取只有兩個參數,但在這三種模式匹配。 –

+0

你有玫瑰樹的數據定義,但似乎期望二叉樹的函數。如果你想'preorderTree'爲你的'Tree'數據類型工作,請看'concatMap'。 – Alec

+2

這實際上不是你的第一個問題,因爲你實際上沒有問任何問題。您還沒有發佈任何錯誤消息。鑑於遍歷和數據聲明不匹配,有兩種可能的修復方法。哪個修正是正確的不清楚,所以我投票結束。隨意編輯問題。 –

回答

2

在Haskell,類型是一組 s。所以我們都有類型構造函數和值構造函數。

所以編寫一個haskell函數。我們需要正確定義類型Tree)。在相應的類型中處理每個Empty,Node ...)。

Tree a類型。它的值是Empty或一羣孩子。因此,我們有

data Tree a = Empty 
      | Node a [Tree a] 

所以,當我們寫一個函數preorderTree :: Tree a -> [a]。我們正在處理類型Tree a,所以我們必須處理值EmptyNode a [Tree a]。因此,我們有

preorderTree :: Tree a -> [a] 
preorderTree Empty = [] 
preorderTree (Node a children) = a : concatMap preorderTree children 

這是一個玫瑰樹,如果你只是想一個二叉樹,我們需要改變Tree a類型的值構造,因爲[Tree a]實在太多了二叉樹。因此,我們有

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

preorderTree :: Tree a -> [a] 
preorderTree Empty = [] 
preorderTree (Node a left right) = a : preorderTree left ++ preorderTree right 

  1. https://wiki.haskell.org/Constructor
+0

非常感謝您的幫助,這真的幫助我,也開始真正喜歡Haskell :) – Deindery