[英]How to prove type equality over an implicit?
我試圖創建一個最小的示例, x
在下面的代碼中未編譯:
sealed trait Foo
case object FooOne extends Foo
sealed trait Bar[T] {
type foo <: Foo
}
object Bar {
implicit case object BarOne extends Bar[Int] {
type foo = FooOne.type
}
}
case class Quk[B: Bar](b: B)
sealed trait Baz[F <: Foo]
case object BazOne extends Baz[FooOne.type]
case class Bat[B: Bar, F <: Foo](r: Quk[B], z: Baz[F])(implicit ev: Bar[B]#foo =:= F)
object Bat {
val x = Bat(Quk(1), BazOne) // Compilation error here!
}
我得到的(日食)錯誤是:
Cannot prove that com.muhuk.Example.Bar[Int]#foo =:= com.muhuk.Example.FooOne.type.
not enough arguments for method apply: (implicit evidence$2: com.muhuk.Example.Bar[Int], implicit ev: =:=[com.muhuk.Example.Bar[Int]#foo,com.muhuk.Example.FooOne.type])com.muhuk.Example.Bat[Int,com.muhuk.Example.FooOne.type] in object Bat. Unspecified value parameter ev.
Foo
並不依賴任何東西。 Bar
& Baz
依賴於Foo
但是除了Bat
之外,他們彼此之間並不了解。
如何獲得Bat
的構造函數,以確保其Quk
參數和Baz
參數具有相同的Foo
類型?
我正在使用Scala 2.11.8。
您可以為Bar
及其依賴類型foo
使用Aux
類型的別名技巧:
object Bar {
type Aux[T, F] = Bar[T] { type foo = F }
// BarOne ...
}
現在,您可以按以下方式定義Bat
:
case class Bat[B, F <: Foo](r: Quk[B], z: Baz[F])(implicit bar: Bar.Aux[B, F])
您的示例現在可以編譯:
val x = Bat(Quk(1), BazOne)
// x: Bat[Int,FooOne.type] = Bat(Quk(1),BazOne)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.