Scala:使用类型类习惯用法的隐式值查找

Scala:使用类型类习惯用法的隐式值查找,scala,reflection,Scala,Reflection,我试图将使用值类实现类型安全的思想扩展到一个更抽象的版本,该版本允许隐式转换。例如,我有一些度量特征 trait Measure { implicit def +[B <: Measure](other: B): Measure val value: Double } 有没有一种方法可以定义“无论B是什么”的转换器实现?如果我们试图将两个不存在转换因子但仍然能够编译的度量加在一起,我想要运行时错误 //will not compile of course. the idea is to

我试图将使用值类实现类型安全的思想扩展到一个更抽象的版本,该版本允许隐式转换。例如,我有一些度量特征

trait Measure {
implicit def +[B <: Measure](other: B): Measure
val value: Double
}
有没有一种方法可以定义“无论B是什么”的转换器实现?如果我们试图将两个不存在转换因子但仍然能够编译的度量加在一起,我想要运行时错误

//will not compile of course. the idea is to somehow reify whatever B 
// is and look that implicit converter up, instead of actual B.
case class Meters(value: Double) extends Measure {
  def +[B <: Measure](other: B): Meters = Meters(this.value + other.value * implicitly[Converter[* B *, Meters]].factor
//当然不会编译。想法是以某种方式具体化B
//是,向上看隐式转换器,而不是实际的B。
箱类仪表(值:双)扩展测量{

def+[B据我所知,你想要的是磁铁模式。这里有一个广泛的博客:

这些问题的一般设计解决方案是假设一种标准的
Measure
。比方说
Meter
。所有其他措施都将实现
标准
toMeter
fromStandard
fromMeter
函数。现在在
Meter
中进行所有…计算…然后使用
fromMeter
将其转换为
Mesure
。其他功能更纯但更高级的方法可以是对类型类使用
adhoc多态性
…非常好的类型类读物->这是Probac这是一个很好的方法。在转换过程中,再增加一个计算步骤,就可以减少n^2个转换因子的需要。+1
trait Converter[F, T]{
  val factor: Double
}
implicit object Meter2Fathom extends Converter[Meter, Fathom]{
  val factor: Double = .556
}
implicit object Fathom2Meter extends Converter[Fathom, Meter]{
  val factor: Double = 1.8
}
//will not compile of course. the idea is to somehow reify whatever B 
// is and look that implicit converter up, instead of actual B.
case class Meters(value: Double) extends Measure {
  def +[B <: Measure](other: B): Meters = Meters(this.value + other.value * implicitly[Converter[* B *, Meters]].factor