【发布时间】:2016-09-27 06:35:29
【问题描述】:
我得到了以下二叉树的定义
abstract class Tree[+A]
case class Leaf[A](value: A) extends Tree[A]
case class Node[A](value: A, left: Tree[A], right: Tree[A]) extends Tree[A]
还有下面的函数
def fold_tree[A,B](f1: A => B)(f2: (A, B, B) => B)(t: Tree[A]): B = t match {
case Leaf(value) => f1(value)
case Node(value, l, r) => f2(value, fold_tree(f1)(f2)(l), fold_tree(f1)(f2)(r)) //post order
}
我被要求使用 fold 方法返回树中最右边的值。这将如何工作?我不确定我是否完全理解折叠,但我认为折叠的目的是对树中的每个元素进行一些操作。如何使用它只返回树的最右边的值?
我也不确定如何调用该方法。我不断遇到未指定参数类型的问题。有人可以告诉我调用这个 fold_tree 方法的正确方法吗?
【问题讨论】:
-
你能告诉我们你到目前为止所做的尝试吗?
-
当然。我很迷茫。我首先想尝试调用该函数并查看结果。我对 scala 很陌生,我不确定如何输入正确的变量/类型。我已经搞砸了 fold_tree[A,Int]( t => 1)(t,t,t => 1)(t) 之类的东西,只是为了看看我是否可以让该方法完全运行并以某种方式返回一个但我不认为我理解正确。
-
其实我可能已经想好怎么做了。你能确认/否认这个推理吗? fold_tree[A,A]( t => t)((t,x,z) => z)(t) 这应该可以工作,因为该方法接受类型 A 并返回类型 A。它告诉方法我们是否在一片叶子,只返回叶子值。如果我们有一个节点和一棵左树和一棵右树,则返回右树的值。对吗?
-
是的!将其发布为答案并接受它!情侣风格的 cmets:
t => t定义为identity,通常最好将下划线放在您不会使用的参数位置:(_,_,z) => z。 -
您是否打算在 SO 上发布您在作业中遇到的所有问题?