我有一个函数,它接收一些数据并返回一个值数组。我需要将数据列表映射到树上。
在创建树时,每次调用我的函数都需要三个参数:
为了论证,我想说:
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和一般的函数式编程都是新手。
答案 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
。
(代码未经测试,但如果错误,您仍然可以使用一般方法。)