gpt4 book ai didi

scala - Scala 2.10 中的 "diverging implicit expansion"错误的解决方法

转载 作者:行者123 更新时间:2023-12-02 03:29:13 25 4
gpt4 key购买 nike

使用以下代码,我在 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 兼容性。

最佳答案

改变

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) 并且无法自行构建一个 (out of eA, eB , eEnv).

希望您的代码生成工具能够生成那样的代码。

关于scala - Scala 2.10 中的 "diverging implicit expansion"错误的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28249063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com