is not a member of a parameter of type T" This is my file. trait Set[T] { def contains(x: T): Boolean def incl(x: T): S...">

Scala REPL "error: value> is not a member of a parameter of type 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 use the ": paste" method because: loading does not 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 the class when using Prof ....

Any help?

+4
source share
2 answers

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

You probably need T be Ordered or to be implicitly convertible to something that Ordered , and therefore they are all 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 (associated with the view) says that the type T must be convertible to S , so it must be either a subtype of S or have an implicit conversion.

Accepter's answer to this question explains this in more detail.

+5
source

Since the " scope " has been deprecated in Scala 2.11, an alternative implementation of a common binary search tree using the context boundary "below:

 object GenericBinarySearchTree { abstract class Set[T] { def incl(x: T): Set[T] def contains(x: T): Boolean def union(that: Set[T]): Set[T] } type L[X] = X => Ordered[X] class Empty[T : L] extends Set[T] { override def toString = "." def incl(x: T): Set[T] = new NonEmpty(x, new Empty, new Empty) def contains(x: T): Boolean = false def union(that: Set[T]): Set[T] = that } class NonEmpty[T : L](elem: T, left: Set[T], right: Set[T]) extends Set[T] { override def toString = "{" + left + elem + right + "}" def incl(x: T): Set[T] = { if(x > elem) new NonEmpty(elem, left, right.incl(x)) else if(x < elem) new NonEmpty(elem, left.incl(x), right) else this } def contains(x: T): Boolean = { if(x == elem) true else if(x > elem) right.contains(x) else left.contains(x) } def union(that: Set[T]): Set[T] = ((left union right) union that) incl elem } } 
0
source

Source: https://habr.com/ru/post/1480321/


All Articles