Search code examples
scalatypesred-black-tree

Scala: How to specify that a collection contains ordered elements?


I would like to define a red-black tree that contains elements which can be compared, but I can't seem to get the types correct. The last line of this code "x < data" fails to compile : "value < is not a member of type parameter T". Is there a canonical way to do this? I've also seen some examples where an implicit parameter is passed to make the conversion from T to Ordered[T] but I can't get that to compile in this code either.

object Color extends Enumeration {
  val Red, Black = Value
}

abstract class RedblackTree[+T <: Ordered[T]] {
  def isEmpty: Boolean
  def member[T](x: T): Boolean
}

case object Empty extends RedblackTree[Nothing] {
  override def isEmpty = true
  override def member[T](x: T) = false
}

final case class Tree[T <: Ordered[T]](
    color: Color.Value,
    leftSubTree: RedblackTree[T],
    data: T,
    rightSubTree: RedblackTree[T]
    ) extends RedblackTree[T] {
  override def isEmpty = false
  override def member[T](x: T) = x < data

Solution

  • When you defined member, you included a type parameter T, shadowing the T in Tree. Since the original T isn't necessarily compatible with the new one, an error was returned. To solve the error, just remove the type parameter on member like so:

    ... def member(x: T) ...