2013-02-10 58 views
0

我有一個函數可以接收一些數據並返回一個值數組。我需要將數據列表映射到樹上。如何從一個獲取父節點信息的函數構建樹

當我創建樹每次調用我的函數需要三個參數:

  • 從字符串
  • 字符的字符串中的索引字符
  • 部分功能的輸出爲節點的父(或零根)

對於參數的緣故,讓我們說我有:

input = "ABC" 

func :: (Char, Int, Int) -> [(Char, Int, Int)] 
func ('A', 1, 0) = [('Q', 1, 1243)] 
func ('B', 2, 1243) = [('D', 2, 7512), ('R', 2, 8253)] -- 1243 taken from above 
func ('C', 3, 7512) = [('E', 3, 2765)] 
func ('C', 3, 8253) = [('Z', 3, 9836)] 

這將映射到像一棵樹:

('Q', 1243) 
    /  \ 
('D',7512) ('R',8253) 
    |   | 
('E',2765) ('Z',9836) 

前兩個參數都很好,我可以建立名單前獲得這些:

input `zip` [1..] 

我不知道如何儘管得到第三個參數,因爲在我開始構建樹之前我只知道根節點的值(它將爲零)。我將不得不瞭解Monads?

注意:我對Haskell和函數式編程都是全新的。

回答

1

是這樣的事情你在追求什麼?

import Data.Tree 

buildForest :: String -> 
       ((Char, Int, Int) -> [(Char, Int, Int)]) -> 
       Forest (Char, Int) 
buildForest input children = go input 1 0 
    where 
     go []  _ _ = [] 
     go (x:xs) i n = map transform (children (x,i,n)) 
      where 
       transform (y,_,n') = Node (y,n') (go xs (i+1) n') 

然後用你的例子,你會把它叫做buildForest "ABC" func

(代碼未經測試,但如果出錯了,您應該仍然可以使用常規方法。)

+0

非常好!非常感謝! – RichardTowers 2013-02-10 01:44:25

相關問題