You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:38:49