scala 类型类隐式歧义

鲁苏尔

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

我有以下特点:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章