我在代数类型层次结构中设置类型类时遇到问题。
我有以下特点:
trait Field[F]{...}
trait VectorSpace3[V,F] extends Field[F]{...}
知道我想提供实现:
trait DoubleIsField extends Field[Double]{
...
}
trait DoubleTurple3IsVectorSpace3 extends VectorSpace3[(Double,Double,Double), Double] with Field[Double]{
...
}
trait MyOtherClassIsVectorSpace3 extends VectorSpace3[MyOtherClass, Double] with Field[Double]{
...
}
//now the implicits
implicit object DoubleIsField extends DoubleIsField
implicit object DoubleTurple3IsVectorSpace3 extends DoubleTurple3IsVectorSpace3 with DoubleIsField
implicit object MyOtherClassIsVectorSpace3 extends MyOtherClassIsVectorSpace3 with DoubleIsField
最后两个隐式导致歧义:DoubleIsField 是 3 个隐式值的一部分,代码无法编译。如何在scala中处理这个问题?
编辑:
错误:
ambiguous implicit values:
[error] both object DoubleIsField in object TypeClasses of type
Russoul.lib.common.TypeClasses.DoubleIsField.type
[error] and object DoubleTurple3IsVectorSpace3 in object TypeClasses of type
Russoul.lib.common.TypeClasses.DoubleTurple3IsVectorSpace3.type
[error] match expected type Russoul.lib.common.TypeClasses.Field[...Double]
编辑2:
def func()(implicit env: Field[Double]): Unit ={
}
func()
完整的测试程序:
object Test extends App {
trait Field[F]{
}
trait VectorSpace3[V,F] extends Field[F]{
}
trait DoubleIsField extends Field[Double]{
}
trait DoubleTurple3IsVectorSpace3 extends VectorSpace3[(Double,Double,Double), Double] with Field[Double]{
}
//now the implicits
implicit object DoubleIsField extends DoubleIsField
implicit object DoubleTurple3IsVectorSpace3 extends DoubleTurple3IsVectorSpace3 with DoubleIsField
def func()(implicit env: Field[Double]): Unit ={
}
func()
}
(根据您最近的评论更新...)
问题是以下函数的定义:
def func()(implicit env: Field[Double]): Unit = {
// ...
}
您的问题是您implicit
在同一范围内有多个此类型的值,因此编译器无法知道要提供哪个值(它们都是可以表示为具有类型的隐式值Field[Double]
)。
关于implicit
参数值的重点是编译器可以识别一个单一的值;如果它不能识别一个,它就不能读懂你的想法并选择正确的一个,你也不希望它随机选择一个。
您可以使用的选项如下:
implicit
参数值并将值显式传递给您的函数。implicit
参数的函数定义更改为具有唯一implicit
值的类型。implicit object
定义。(很抱歉最初将其从列表中删除。)本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句