在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