如何证明类型相等于隐式?

时间:2016-07-12 06:24:02

标签: scala types

我尝试创建一个最小的示例,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!
}

我得到的错误(在eclipse中)是:

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&amp; Baz Foo取决于Bat,但他们彼此之间并不了解,Bat的情况除外。

如何获取Quk的构造函数以确保其Baz参数和Foo参数具有相同的class MyAdapter extends ArrayAdapter<Places> { Context context=null; public MyAdapter(Context context, List<Places> objects) { super(context, R.layout.list_item, objects); this.context=context; } 类型?

我正在使用Scala 2.11.8。

1 个答案:

答案 0 :(得分:1)

您可以对Aux及其相关类型Bar使用foo类别别名技巧:

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)