在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返回Stream
到根。在此基础上调用.length
可以计算出可以在左侧折叠中进行比较的深度,但感觉很笨重。
我怎样才能做到这一点?
答案 0 :(得分:1)
我能够计算具有尾递归功能的父母,不确定你是否会考虑或多或少“笨重”:
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