Scalaz树-从树文件集中查找最小/最大深度



在Scalaz中,我有一个类似Tree[A]的;

'A'.node('B'.leaf, 'C'.node('D'.leaf), 'E'.leaf)

现在假设我有一个函数,它在树中递归并返回一个TreeLoc

def getCharLoc(c: Char) = tree.loc.find(_.getLabel == c)

然后我做一些类似的事情

Seq('D','E').flatMap(getCharLoc)

如何在树中找到最低和/或最高的loc。在上面的示例中,'D'是最低/最深的位置,而'E'是最高/最浅的位置。

我想每个loc都有一个.path方法,它从loc向root返回一个Stream。调用.length可以计算出深度,可以在左侧折叠中进行比较,但感觉很笨重。

我怎样才能做到这一点?

我能够用尾部递归函数计算父母,不确定你是否会认为这或多或少是"笨拙的":

val tree = 'A'.node('B'.leaf, 'C'.node('D'.leaf), 'E'.leaf)
@tailrec def countParents(loc: Option[TreeLoc[Char]], acc: Int = 0): Int = 
  loc >>= { _.parent } match {
    case None => acc
    case next @ _ => countParents(next, acc + 1)
  }
println(countParents(tree.loc.find(_.getLabel == 'D'))) // 2
println(countParents(tree.loc.find(_.getLabel == 'E'))) // 1

相关内容

  • 没有找到相关文章

最新更新