我有一个树,它存储节点中的元素列表。我需要编写一个函数,它接受这样的树,并返回节点中元素和的树。
我认为这是一项简单的任务,但出现了一些错误:错误
以下是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)
我不知道为什么它在那里期望字符串,所以如果可以的话,请向我解释一下:(
- 类名应以大写字母开头
0
是一个32位整数,您希望0d
代表64位Double
s- 您希望为
Double
定义transformTree
,而不是为绑定到名为Double
的类型变量的任意类型定义。目前,您的函数签名相当于def transformTree[X](t: Tree[List[X]]): Tree[X]
,除了它是Any
的子类型之外,对X
几乎一无所知,因此有一个+
操作,用于将其字符串表示与其他字符串连接起来 - 您的
tr
应该是Tree[Double]
,而不是Tree[Int]
- 有
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
是一个泛型类型参数,并且这个类型参数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
这意味着在def transformTree[Double]
def
的范围内,这些Double
不是实际的Double
,而是一个变量类型,将在实际使用函数时决定。
由于您使用的是从0
开始的a + b
fold
,这意味着您的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)