簡體   English   中英

如何在隱式上證明類型相等?

[英]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並不依賴任何東西。 BarBaz依賴於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.

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