关于Haskell中treePositions函数的列表推导式理解求助
解析Haskell的treePositions函数
我来帮你一步步拆解这个计算树路径的Haskell函数,搞懂它的逻辑:
首先先看完整的函数定义:
treePositions :: Tree a -> [[Int]] treePositions (Node _ ts) = [] : [ (i : is ) | i <- [0..(length ts - 1)], is <- treePositions (index ts i) ]
1. 类型签名理解
treePositions :: Tree a -> [[Int]]
这个函数接受一个任意类型的树(Tree a,a是节点存储的任意数据类型),返回一组整数列表。每个整数列表代表一条从根节点到树中某个节点的有效路径,列表里的每个数字是路径上经过的边的索引(从0开始计数)。
2. 模式匹配与基础路径
treePositions (Node _ ts)这里用模式匹配匹配树的构造器Node:
_表示我们不关心当前节点存储的具体值,只需要它的子节点列表ts;- 函数返回的第一项是
[],这对应根节点到自身的路径——因为不需要走任何边,所以路径是空列表。
3. 列表推导式:生成子树路径
后面的列表推导式[ (i : is ) | i <- [0..(length ts - 1)], is <- treePositions (index ts i) ]是函数的核心,用来生成所有从根到子树节点的路径,拆解来看:
i <- [0..(length ts - 1)]:遍历当前节点所有子节点的索引,从0到子节点总数减1(因为Haskell列表是0索引的);is <- treePositions (index ts i):递归调用treePositions,获取第i个子节点的所有路径(这里index函数就是取子节点列表ts中第i个元素,也就是对应的子树);i : is:把当前子节点的索引i加到子节点路径is的前面,这样就得到了从根节点出发,经过i号边,再到子树对应节点的完整路径。
举个例子更直观
假设我们有一棵简单的树:
-- 假设Tree的定义是:data Tree a = Node a [Tree a] sampleTree = Node "root" [ Node "child0" [], Node "child1" [Node "grandchild1-0" []] ]
调用treePositions sampleTree会得到:[[], [0], [1], [1,0]]
[]:根节点到自身[0]:根节点→child0[1]:根节点→child1[1,0]:根节点→child1→grandchild1-0
这样是不是就清晰多啦?
内容的提问来源于stack exchange,提问作者hhwwww
相关产品推荐
相关产品推荐

