穿越Scalaz树

时间:2017-05-10 06:53:58

标签: scala tree scalaz scalaz7

我正在尝试理解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])上操作。

1 个答案:

答案 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)

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