簡體   English   中英

如何定義具有更高種類類型(類型構造函數)的上下文

[英]How to define a context bound with a higher kinded Type (Type Constructor)

我已經嘗試了以下

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)
}

如果您真的堅持使用上下文綁定,您可以編寫一個類型 lambda:

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))
}

當您編寫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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM