[英]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
,它是一個新的類型參數(您可以將其表示為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"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.