def test[Option[T]: Ordering]...を参照しOptionないと書くとscala.Option、それは新しい型パラメーターです (それを指定してOptionもF何でもかまいません)。そう
def test[Option[T]: Ordering](value1: Option[T], value2: Option[T]) = {
val e = implicitly(Ordering[Option[T]].compare(value1, value2))
}
実際には
def test[F[_]: Ordering](value1: F[T], value2: F[T]) = {
val e = implicitly(Ordering[F[T]].compare(value1, value2))
}
別名
def test[F[_]](value1: F[T], value2: F[T])(implicit ev: Ordering[F]) = {
val e = implicitly(Ordering[F[T]].compare(value1, value2))
}
Tが定義されてOrdering[F]おらず、意味がないため、これはコンパイルされません。コンパイルされるのは
def test[F[_], T](value1: F[T], value2: F[T])(implicit ev: Ordering[F[T]]) = {
val e = implicitly(Ordering[F[T]].compare(value1, value2))
}
スイッチを入れることをお勧めしscalacOptions += "-Xlint:type-parameter-shadow"ます。