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"
ます。