С помощью следующего кода я получаю ошибку «расходящееся неявное расширение» в 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])
Это не помогает. Не переносится и complexFoo
и Bar1
в подкласс Foo
, чтобы получить выгоду от более высокого относительного веса. Явная передача аргумента (extends Bar[(Array[Env], ((Int,A)) => B)]()(complexFoo)
) действительно работает, но я бы очень хотел избежать этого (Bar1
- это фактически сгенерированный код, и это усложнит генерацию). Итак, есть ли другой способ избежать ошибки?
Это нормально работает в 2.11.5, но пока мы не можем удалить совместимость с 2.10.