2

私は次のことを試しました

def test[Option[T]: Ordering](value1: Option[T], value2: Option[T]) = {
  val e = implicitly(Ordering[Option[T]].compare(value1, value2))
}

しかし、動作しませんか?何が問題なのですか?

編集

これはもちろん機能します

def test[T](value1: Option[T], value2: Option[T]) (implicit ev: Ordering[Option[T]]) = {
  ev.compare(value1, value2)
}
4

2 に答える 2

3

どうしてもコンテキスト バウンドを使用したい場合は、ラムダ型を記述できます。

def test[T: ({type L[x] = Ordering[Option[x]]})#L](value1: Option[T], value2: Option[T]) = {
  val e = implicitly(Ordering[Option[T]].compare(value1, value2))
}

または、kind-projectorプラグインを使用すると、これを少しきれいにすることができます。

def test[T: Lambda[x => Ordering[Option[x]]]](value1: Option[T], value2: Option[T]) = {
  val e = implicitly(Ordering[Option[T]].compare(value1, value2))
}
于 2020-09-16T15:39:30.053 に答える
3

def test[Option[T]: Ordering]...を参照しOptionないと書くとscala.Option、それは新しい型パラメーターです (それを指定してOptionF何でもかまいません)。そう

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

于 2020-09-16T19:15:19.647 に答える