0
私は、最小限の例を作成しようとしました、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
doesnの」何にも依存しない。 Bar
& Baz
はFoo
に依存しますが、Bat
という文脈を除き、お互いを知りません。
にはどうすればBat
のそのQuk
パラメータを確実にするために、コンストラクタとBaz
パラメータが同じFoo
タイプの両方を持ってもらうことができますか?
私はScala 2.11.8を使用しています。
私はこれをupvoteできますしたい もっと。より詳細な説明は次のとおりです:http://gigiigig.github.io/posts/2015/09/13/aux-pattern.html – muhuk