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
定义。 (很抱歉最初将其从列表中遗漏了。)
我在代数类型层次结构中设置类型 类 时遇到问题。
我有以下特点:
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
定义。 (很抱歉最初将其从列表中遗漏了。)