1

我正在尝试了解 scalaz 树结构并且遇到了一些困难!

首先我定义了一棵树:

val tree: Tree[Int] =
      1.node(
        2.leaf,
        3.node(
          4.leaf,
          5.leaf))

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

tree.loc.find(x => x.getLabel == 3)

我的下一个挑战是尝试找到与某个谓词匹配的所有节点。例如,我想找到所有叶节点(使用TreeLocisLeaf应该很容易)。不幸的是,我一生都无法弄清楚如何走树来做到这一点。

编辑:对不起,我认为我最初的问题不够清楚。需要明确的是,我想以这样一种方式遍历树,以便我可以获得有关节点的信息。Flatten、foldRight 等只允许我对 [Int] 进行操作,而我希望能够对 Tree[Int](或 TreeLoc[Int])进行操作。

4

1 回答 1

1

看看如何find在 scalaz 中实现,我的建议是实现类似的东西:

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但它给你的不是 aStream[TreeLoc[A]]而不是 a Option[TreeLoc[A]]

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

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

于 2017-05-15T09:10:44.363 回答