如何从获取父节点信息的函数构建树

时间:2013-02-10 00:21:41

标签: haskell

我有一个函数,它接收一些数据并返回一个值数组。我需要将数据列表映射到树上。

在创建树时,每次调用我的函数都需要三个参数:

  • 字符串
  • 中的字符
  • 字符串
  • 中的字符索引
  • 节点父节点的函数输出的一部分(或根节点为零)

为了论证,我想说:

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 个答案:

答案 0 :(得分: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

(代码未经测试,但如果错误,您仍然可以使用一般方法。)