Ну ... дело в том, что когда вы определяете def
, например,
def abc[A](a: A) = ??
Этот A
здесь является параметром универсального типа, и этот параметр типа A
имеет наивысший приоритет вразрешение типа внутри области действия def
.Таким образом, любой другой тип A
не будет распознаваться как A
в этой области.
Проще говоря, если вы сделаете что-то вроде
def abc[Double](a: Double) = a
Это Double
здесьне факт Double
, который вы знаете, но это параметр типа, который открыт для пользователя этого def
.
И приведенная выше строка эквивалентна,
def abc[A](a: A) = a
// Or
def abc[B](b: B) = b
Thisозначает, что в области действия def transformTree[Double]
def
эти Double
не являются действительными Double
, а являются типом переменной, который будет определен при фактическом использовании функции.
И так как выиспользование этого a + b
fold
, начинающегося с 0
, означает, что ваш transform
в значительной степени фиксирован.И если вы хотите реализовать это для Double
,
sealed trait Tree[+A]
case object Empty extends Tree[Nothing]
case class Node[A](element: A, left: Tree[A], right: Tree[A]) extends Tree[A]
val tr = Node(
List(1d, 2d, 3d),
Node(
List(3d, 4d, 5d),
Empty,
Node(
List(2d, 4d, 5d),
Empty,
Empty
)
),
Node(
List(6d, 7d, 8d),
Empty,
Empty
)
)
def transformTree(t: Tree[List[Double]]): Tree[Double] = {
t match {
case Empty => Empty
case Node(l, left, right) => Node(
l.foldLeft(0d)((acc: Double, elem: Double) => (acc + elem)),
transformTree(left),
transformTree(right)
)
}
}
transformTree(tr)