奇怪的标量错误.找到:scala.Double必填Double



我有一个树,它存储节点中的元素列表。我需要编写一个函数,它接受这样的树,并返回节点中元素和的树。

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

以下是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)

我不知道为什么它在那里期望字符串,所以如果可以的话,请向我解释一下:(

  1. 类名应以大写字母开头
  2. 0是一个32位整数,您希望0d代表64位Doubles
  3. 您希望为Double定义transformTree,而不是为绑定到名为Double的类型变量的任意类型定义。目前,您的函数签名相当于def transformTree[X](t: Tree[List[X]]): Tree[X],除了它是Any的子类型之外,对X几乎一无所知,因此有一个+操作,用于将其字符串表示与其他字符串连接起来
  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)

嗯。。。问题是,当你定义一个类似def的以下内容时,

def abc[A](a: A) = ??

这里的这个A是一个泛型类型参数,并且这个类型参数Adef作用域内的类型解析中具有最高优先级。因此,在此范围内,任何其他类型的A都不会被识别为A

简单地说,如果你做一些类似的事情

def abc[Double](a: Double) = a

这里的Double不是您所知道的实际Double,而是为该def的用户打开的类型参数。

上面的线相当于,

def abc[A](a: A) = a
// Or
def abc[B](b: B) = b

这意味着在def transformTree[Double]def的范围内,这些Double不是实际的Double,而是一个变量类型,将在实际使用函数时决定。

由于您使用的是从0开始的a + bfold,这意味着您的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)

最新更新