首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表理解与列表列表

列表理解与列表列表
EN

Stack Overflow用户
提问于 2018-03-28 18:21:18
回答 1查看 1.6K关注 0票数 0

我在理解以下代码时遇到了问题:

代码语言:javascript
复制
treePositions :: Tree a -> [[Int]]
treePositions (Node _ ts) =
    [] : [ (i : is ) | i <- [0..(length ts - 1)],
    is <- treePositions (index ts i) ]

此函数将计算到给定树中某个位置的任何有效路径,其中每个节点的边缘都被标记为0..lastOutgoingEdge。如果理解正确,索引函数将在树的节点列表中的索引I处返回节点。

代码语言:javascript
复制
index :: [a] -> Int -> a
index :: [a] -> Int -> a
index [] i = error "invalid index"
index (x:xs) 0 = x
index (x:xs) i = ith xs (i-1) 

现在,对于给定的树木:

代码语言:javascript
复制
t1 = Node "a" [
        Node "b" [
            Node "c"[],
            Node "d"[]
        ]
     ]
t2 = Node "z" [] 

该职能将返回:

代码语言:javascript
复制
treePositions t1 == [ [], [0], [0,0], [0,1] ] 
treePositions t2 == [ [] ]

我不明白的是这部分:

[] : [ (i : is ) | i <- [0..(length ts - 1)],is <- treePositions (index ts i) ]

我的想法:

如果我有x|x <- [0..10], x < 2。这将翻译为“取[0..10]中的每一个x,而x < 2适用于它。那么,如果我在[0..(length ts - 1)]中取每一个i,这又如何返回条件的列表?”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-28 18:37:17

在您的例子中,逗号后面的部分不是条件,而是第二个生成器。简化后的表示法如下:

代码语言:javascript
复制
> [ (a, b) | a <- [1..3], b <- [1..2] ]
> [(1,1),(1,2),(2,1),(2,2),(3,1),(3,2)]

上面的例子说明如下:

  1. 通过列表[1..3],对于它的每一个元素,
  2. 通过列表[1..2],对于它的每一个元素,
  3. 生产一个元组

此外,发电机还可以依赖先前发电机的元件,例如:

代码语言:javascript
复制
> [ (a, b) | a <- [1..3], b <- [1..a] ]
> [(1,1),(2,1),(2,2),(3,1),(3,2),(3,3)]

所以在你的情况下:

代码语言:javascript
复制
[ (i : is ) | i <- [0..(length ts - 1)],is <- treePositions (index ts i) ]

逻辑是这样的:

  1. 每一次i0..(length ts - 1)
  2. treePositions (index ts i)上翻阅每一个treePositions (index ts i)
  3. 并产生i : is作为结果
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49541559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档