user2374587 - 5 months ago 40

Scala Question

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.