如何汇总此scala 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

我是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_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的类型。

好的,我现在明白了。非常感谢。好的,我现在明白了。非常感谢。