首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历Scalaz树

遍历Scalaz树
EN

Stack Overflow用户
提问于 2017-05-10 06:53:58
回答 1查看 382关注 0票数 1

我正试着理解黄花树的结构,并且遇到了一些困难!

首先我定义了一棵树:

代码语言:javascript
复制
val tree: Tree[Int] =
      1.node(
        2.leaf,
        3.node(
          4.leaf,
          5.leaf))

到目前为止,使用TreeLoc,我已经解决了如何找到与某些谓词匹配的第一个元素。例如,要查找值为3的第一个节点:

代码语言:javascript
复制
tree.loc.find(x => x.getLabel == 3)

我的下一个挑战是尝试查找与某些谓词匹配的所有节点。例如,我想找到所有的叶节点(使用TreeLoc和isLeaf应该非常容易)。不幸的是,在我的一生中,我无法想出如何走这棵树来做到这一点。

编辑:对不起,我想我原来的问题还不够清楚。要清楚地说,我想以这样一种方式行走这棵树,这样我就可以得到关于节点的信息。扁平化、foldRight等只允许我在Int上操作,而我希望能够在Tree上操作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-15 09:10:44

为了查看find是如何在scalaz中实现的,我的建议是实现如下内容:

代码语言:javascript
复制
implicit class FilterTreeLoc[A](treeLoc: TreeLoc[A]){
  def filter(p: TreeLoc[A] => Boolean): Stream[TreeLoc[A]] =
    Cobind[TreeLoc].cojoin(treeLoc).tree.flatten.filter(p)
}

它的行为类似于find,但它给您的是一个Stream[TreeLoc[A]]而不是一个Option[TreeLoc[A]]

您可以将其用作tree.loc.filter(_.isLeaf)tree.loc.filter(_.getLabel == 3)

注意:如果您希望将隐式类声明为方法,那么显然可以避免使用隐式类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43885434

复制
相关文章

相似问题

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