针对"分歧隐式扩展的解决方法" Scala 2.10中的错误

时间:2015-01-31 06:49:53

标签: scala implicit scala-2.10

使用以下代码,我在Scala 2.10中出现“分歧隐式扩展”错误,即使有一种独特的方法来构造隐式:

class Foo {
  trait Foo[A]
  abstract class Bar[A](implicit e: Foo[A])

  implicit val intFoo: Foo[Int] = ???
  implicit def pairFoo[A, B](implicit ea: Foo[A], eb: Foo[B]): Foo[(A, B)] = ???
  implicit def funcFoo[A, B](implicit ea: Foo[A], eb: Foo[B]): Foo[A => B] = ???
  implicit def arrayFoo[A](implicit e: Foo[A]): Foo[Array[A]] = ???
  def foo[A](implicit e: Foo[A]): Foo[A] = e
  class Bar1[A, B, Env](implicit eA: Foo[A], eB: Foo[B], eEnv: Foo[Env])
    extends Bar[(Array[Env], ((Int,A)) => B)]
}

> compile
[info] Compiling 1 Scala source to /home/aromanov/IdeaProjects/playground/target/scala-2.10/classes...
[error] /home/aromanov/IdeaProjects/playground/src/main/scala/Foo.scala:15: diverging implicit expansion for type Foo1.this.Foo[(Array[Env], ((Int, A)) => B)]
[error] starting with method pairFoo in class Foo
[error]   class Bar1[A, B, Env](implicit eA: Foo[A], eB: Foo[B], eEnv: Foo[Env])
[error]                        ^

我添加了一个更具体的隐式转换,希望它会被选中:

implicit def complexFoo[A, B, Env](implicit eA: Foo[A], eB: Foo[B], eEnv: Foo[Env]): Foo[(Array[Env], ((Int,A)) => B)] =
  pairFoo(arrayFoo(eEnv), foo[((Int, A)) => B])

这没有用。也没有将complexFooBar1移动到Foo的子类,以便从更高的relative weight中受益。明确地传递参数(extends Bar[(Array[Env], ((Int,A)) => B)]()(complexFoo))确实有效,但我真的想避免它(Bar1实际上是生成代码,这会使生成变得更复杂)。那么,还有另一种方法可以避免错误吗?

这在2.11.5中运行良好,但我们现在无法删除2.10兼容性。

1 个答案:

答案 0 :(得分:1)

更改

class Bar1[A, B, Env](implicit eA: Foo[A], eB: Foo[B], eEnv: Foo[Env])
  extends Bar[(Array[Env], ((Int,A)) => B)]

class Bar1[A, B, Env](implicit foo: Foo[(Array[Env], ((Int,A)) => B)])
  extends Bar[(Array[Env], ((Int,A)) => B)]

使您的代码编译。显然,scalac 2.10需要直接在此隐含地建议(foo),并且在构建一个(eAeBeEnv)时失败。< / p>

希望您的代码生成工具能够生成这一点。