This is my file
trait Set[T] {
def contains(x: T): Boolean
def incl(x: T): Set[T]
def union(that: Set[T]): Set[T]
}
class Empty[T] extends Set[T] {
override def toString = "."
def contains(x: T): Boolean = false
def incl(x: T): Set[T] = new NonEmpty[T](x, new Empty[T], new Empty[T])
def union(that: Set[T]): Set[T] = that
}
class NonEmpty[T](elem: T, left: Set[T], right: Set[T]) extends Set[T] {
override def toString = "{" + left + elem + right + "}"
def contains(x: T): Boolean =
if (x < elem) left contains x
else if (x > elem) right contains x
else true
def incl(x: T): Set[T] =
if (x < elem) new NonEmpty(elem, left incl x, right)
else if (x > elem) new NonEmpty(elem, left, right incl x)
else this
def union(that: Set[T]): Set[T] =
((left union right) union that) incl elem
}
I'm using the ":paste" method because :load doesn't work. But I get the following error
<console>:25: error: value < is not a member of type parameter T
if (x < elem) left contains x
^
<console>:26: error: value > is not a member of type parameter T
else if (x > elem) right contains x
^
<console>:30: error: value < is not a member of type parameter T
if (x < elem) new NonEmpty(elem, left incl x, right)
^
<console>:31: error: value > is not a member of type parameter T
else if (x > elem) new NonEmpty(elem, left, right incl x)
I'm sure this file is correct, because it is from class examples, and it worked in class when Prof. is using...
Any helps?
You get that error because not every type
T
has>
,<
etc. defined.What you probably wanted is
T
to beOrdered
or be implicitly convertible to something that isOrdered
, and therefore have all of them defined.This should fix the error messages:
T <% S
(a view bound) says that typeT
must be convertible toS
, so it has to be either a subtype ofS
or have implicit conversion defined.Accepter answer to this queston explains it in more detail.
Since "view bounds" have been deprecated in Scala 2.11, an alternative implementation of a generic Binary Search Tree using "context bounds" is below: