奇怪的scala错误.发现:scala.Double必需双

Bar*_*nek 1 tree functional-programming scala

我有一个树存储节点中的元素列表.我需要编写一个函数来获取这样的树并返回在节点中具有元素总和的树.

我认为这是一项简单的任务,但发生了一些错误: 错误

这是IntelliJ显示的内容:

编译错误的代码

最后这是我的代码:

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(1,2,3),Node(List(3,4,5),Empty,Node(List(2,4,5),Empty,Empty)),Node(List(6,7,8),Empty,Empty))

def transformTree[Double](t:tree[List[Double]]):tree[Double]={
t match{
case Empty => Empty
case Node(l,left,right)=>Node[Double](l.foldLeft(0)((a:Double,b:Double)=>(a+b)),transformTree(left),transformTree(right))
}
}
   transformTree(tr)
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它会在那里期待弦,所以如果可以的话请向我解释一下:)

And*_*kin 5

  1. 类名应以大写开头.
  2. 0是一个32位整数,你想要0d64位Doubles.
  3. 您想要定义transformTreefor Double,而不是为绑定到变量类型的任意类型调用Double.目前,您的函数签名等同于def transformTree[X](t: Tree[List[X]]): Tree[X],X除了它是子类型之外几乎没有任何已知的Any,因此具有将+其字符串表示与其他字符串连接的操作.
  4. 你的tr应该是Tree[Double],而不是Tree[Int].
  5. sum,没有必要fold.即使你想foldLeft,也应该是这样的l.foldLeft(0d)(_ + _).

这编译:

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[Double](l.sum, transformTree(left), transformTree(right))
  }
}
transformTree(tr)
Run Code Online (Sandbox Code Playgroud)