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

4

1 回答 1

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.

(代码未经测试,但如果它是错误的,你应该仍然能够使用一般方法。)

于 2013-02-10T01:17:14.390 回答