我正在尝试在Scala中开发二叉树结构,但出现错误消息:
Error:(15, 54) No implicit Ordering defined for A.
override def add[A](new_value: A): BinaryTree[A] = new Node(NullNode,new_value,NullNode)
有人可以解释一下我该如何解决吗?这是代码,问题出在 NullNode 对象的 add 方法中,当您尝试为 Node创建左侧时会调用此方法。
sealed abstract class BinaryTree[+A] {
def isEmpty: Boolean
def isValid: Boolean
def add[B >: A](new_value: B): BinaryTree[A]
def isLeaf: Boolean
def length: Int
}
case object NullNode extends BinaryTree[Nothing] {
override def isEmpty: Boolean = true
override def isValid: Boolean = true
override def isLeaf: Boolean = false
override def add[A](new_value: A): BinaryTree[A] = new Node(NullNode,new_value,NullNode)
override def length: Int = 0
}
case class Node[A] (
var left : BinaryTree[A],
var value : A,
var rigth : BinaryTree[A] )
( implicit ord: Ordering[A] ) extends BinaryTree[A] {
override def isEmpty: Boolean = false
override def isValid: Boolean = {
import ord._
def isValidWith (f: A => Boolean, t: BinaryTree[A]): Boolean = t match {
case NullNode => true
case Node(_,valueNode,_) => f(valueNode) && t.isValid
}
isValidWith(value < _, left) && isValidWith(value > _, rigth)
}
override def isLeaf: Boolean = left.isEmpty && rigth.isEmpty
override def add[B >: A](new_value: B): BinaryTree[A] = {
import ord._
def travel (t: BinaryTree[A]): BinaryTree[A] = t match {
case NullNode => t.add(new_value)
case Node (left,nodeValor,rigth) => {
if (new_value > nodeValor) new Node(travel(left),nodeValor,rigth)
else if (new_value < nodeValor) new Node(left,nodeValor, travel(rigth))
else throw new Exception("Valor ya introducido")
}
}
travel(this)
}
override def length: Int = {
def travel (t: BinaryTree[A]): Int = t match {
case NullNode => t.length
case Node(left,_,rigth) => left.length + rigth.length + 1
}
travel(this)
}
}
object BinaryTree {
def apply[A] (value: A)(implicit ord: Ordering[A]): BinaryTree[A] = new Node(NullNode,value,NullNode)
}
目前,我尝试了不同的实现,将 Ordering 添加到抽象类的通用类型中,或将抽象类设置为特征,但是我都没有想要的。如果有人能解释这个错误的原因,我将不胜感激。
答案 0 :(得分:2)
基本问题来自于以下事实:没有Ordering[Nothing]
表示NullNode
不能排序,但是Node.value
类型必须是
我通过在每个Ordering
方法引用中添加add()
并调整value
类型与left
/ right
节点之间的关系来进行编译类型。
sealed abstract class BinaryTree[+A] {
def isEmpty: Boolean
def isValid: Boolean
def add[B >: A :Ordering](new_value: B): BinaryTree[B]
. . .
。 。
case object NullNode extends BinaryTree[Nothing] {
override def isEmpty: Boolean = true
override def isValid: Boolean = true
override def isLeaf: Boolean = false
override def add[A:Ordering](new_value: A): BinaryTree[A] =
Node(NullNode, new_value, NullNode)
. . .
。 。
case class Node[A,C<:A](left : BinaryTree[C]
,value : A
,rigth : BinaryTree[C]
)(implicit ord: Ordering[A]) extends BinaryTree[A] { . . .
。 。
override def add[B >: A :Ordering](new_value: B): BinaryTree[B] = {
import ord._
def travel(t: BinaryTree[A]): BinaryTree[B] = t match { . . .
代码还存在其他问题,但至少可以编译。