Во-первых, вы можете поместить fold
в сопутствующий объект Tree
(поскольку fold
не использует this
, т.е. "stati c").
Во-вторых, начните с реализация map
для вашего случая
def map[A,B](t: Tree[A])(f: A => B): Tree[B] = t match {
case Leaf() => ???_1
case Branch(l, r, v) => ???_2 // here l, r are Tree[A]'s i.e. subtrees of t
}
смотрим, как это реализовано для деревьев со значениями в листьях.
Затем замените эту реализацию той, которая использует fold
def map[B](f: A => B): Tree[B] =
fold[A, Tree[B]](this)(() => ???_1_)((l: Tree[B], r: Tree[B], v: A) => ???_2_))
// here l, r are Tree[B]'s i.e. results of map for subtrees
???_1_
и ???_2_
- это ???_1
, ???_2
, где вы заменяете рекурсивный вызов map
на l
, r
, которые являются результатами рекурсивного вызова . Итак, ???_1_
- это точно ???_1
.