【问题标题】:How to build a tree from a function that takes information about the parent node如何从获取有关父节点信息的函数构建树
【发布时间】:2013-02-10 00:21:40
【问题描述】:

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

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

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

为了争论,假设我有:

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 和一般的函数式编程完全陌生。

【问题讨论】:

    标签: 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

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

    【讨论】:

    • 非常好!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多