如何汇总此scala fold_树函数中的所有节点
我是scala的初学者。我得到了一个fold_tree_preorder函数,它在二叉树上实现了高阶函数fold。树、节点和叶定义如下所示如何汇总此scala fold_树函数中的所有节点,scala,fold,Scala,Fold,我是scala的初学者。我得到了一个fold_tree_preorder函数,它在二叉树上实现了高阶函数fold。树、节点和叶定义如下所示 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_pre
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_preorder [Z,A](f:(Z,A)=>Z) (z:Z) (t:Tree[A]) : Z =
t match {
case Leaf(value) => f(z, value)
case Node(value , lt, rt) => {
val z1 = f(z,value)
val z2 = fold_tree_preorder (f) (z1) (lt)
fold_tree_preorder (f) (z2) (rt)
}
}
我不知道如何实际调用这个函数。我正在尝试做如下事情:
def count_tree [A](t:Tree[A]) : Int =
fold_tree_preorder[A,A=>A]((z,a)=>(z+a))(0)(t)
但是我得到了一些错误,比如类型不匹配错误。我认为参数本身也不正确,但我甚至不确定如何测试输出结果,因为我无法找到调用fold_tree_preorder函数的正确方法。如何输入正确的语法来调用此函数?
z
是fold_tree\u preorder
函数是您期望的输出类型,即Int
使用下面的函数
假设count\u tree
计算树的节点数
def count_tree [A](t:Tree[A]) : Int =
fold_tree_preorder[Int, A]((z,a) => z + 1 )(0)(t)
只需在访问节点时向z添加
1
即可计算节点数z
是折叠树(fold_tree_preorder)
函数是您期望的输出类型Int
def fold_tree_preorder [Z,A](f:(Z,A)=>Z) (z:Z) (t:Tree[A]) : Z
使用下面的函数
假设count\u tree
计算树的节点数
def count_tree [A](t:Tree[A]) : Int =
fold_tree_preorder[Int, A]((z,a) => z + 1 )(0)(t)
只需在访问节点时向z添加1
,即可计算节点数
def fold_tree_preorder [Z,A](f:(Z,A)=>Z) (z:Z) (t:Tree[A]) : Z
第一个参数是f
,是迄今为止获取结果(类型为Z
)和树中包含的值的函数A
)
在函数中,您可以根据不知道元素类型的树返回一个Int
,参数化为a
。这将导致您向A
添加Int
求和和和计数是不同的事情,如果您决定计算值的数量,您不需要了解A
。如果决定对值求和,则需要知道为a
定义了+
运算符
您可能需要进一步了解scala的类型。
第一个参数是f
,是迄今为止获取结果(类型为Z
)和树中包含的值的函数A
)
在函数中,您可以根据不知道元素类型的树返回一个Int
,参数化为a
。这将导致您向A
添加Int
求和和和计数是不同的事情,如果您决定计算值的数量,您不需要了解A
。如果决定对值求和,则需要知道为a
定义了+
运算符
您可能需要进一步了解scala的类型。
好的,我现在明白了。非常感谢。好的,我现在明白了。非常感谢。