user2374587 user2374587 - 3 months ago 14
Scala Question

Scala REPL "error: value > is not a member of type parameter T"

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?

Answer

You get that error because not every type T has >,< etc. defined.

What you probably wanted is T to be Ordered or be implicitly convertible to something that is Ordered , and therefore have all of them defined.

This should fix the error messages:

class NonEmpty[T <% Ordered[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
}

T <% S (a view bound) says that type T must be convertible to S, so it has to be either a subtype of S or have implicit conversion defined.

Accepter answer to this queston explains it in more detail.