我正在尝试理解scalaz树结构并且遇到了一些困难!
首先我定义了一棵树:
val tree: Tree[Int] =
1.node(
2.leaf,
3.node(
4.leaf,
5.leaf))
到目前为止,使用 TreeLoc 我已经找到了如何找到匹配某个谓词的 first 元素。例如。找到值为3的第一个节点:
tree.loc.find(x => x.getLabel == 3)
我的下一个挑战是尝试找到匹配某个谓词的所有节点。例如,我想找到所有叶子节点(使用 TreeLoc 和 isLeaf 这应该很容易)。不幸的是,我不能为我的生活找出如何走树去做这件事。
编辑:抱歉,我认为我原来的问题不够清楚。要清楚,我想以这样的方式走树,以便我可以获得有关节点的信息。 Flatten,foldRight等只允许我在[Int]上操作,而我希望能够在Tree [Int](或TreeLoc [Int])上操作。
答案 0 :(得分:1)
看看如何在scalaz中实现find
,我的建议是实现类似的东西:
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)
。
注意:如果您希望将此声明为方法,则显然可以避免使用隐式类。