scala 类型 类 隐式歧义

scala type classes implicit ambiguity

我在代数类型层次结构中设置类型 类 时遇到问题。

我有以下特点:

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 定义。 (很抱歉最初将其从列表中遗漏了。)