When you write def test[Option[T]: Ordering]...
the Option
doesn't refer to scala.Option
, it's a new type parameter (you can denote it Option
or F
whatever). So
def test[Option[T]: Ordering](value1: Option[T], value2: Option[T]) = {
val e = implicitly(Ordering[Option[T]].compare(value1, value2))
}
is actually
def test[F[_]: Ordering](value1: F[T], value2: F[T]) = {
val e = implicitly(Ordering[F[T]].compare(value1, value2))
}
aka
def test[F[_]](value1: F[T], value2: F[T])(implicit ev: Ordering[F]) = {
val e = implicitly(Ordering[F[T]].compare(value1, value2))
}
This does't compile because T
is not defined and Ordering[F]
doesn't make sense. What would compile is
def test[F[_], T](value1: F[T], value2: F[T])(implicit ev: Ordering[F[T]]) = {
val e = implicitly(Ordering[F[T]].compare(value1, value2))
}
I would recomment to switch on scalacOptions += "-Xlint:type-parameter-shadow"
.