我正在编写一个解释器,并尝试使用从how-to-set-up-implicit-conversion-to-allow-arithmetic-between-numeric-types 解决我需要能够添加 Boolean + Boolean, Int 的相同问题+ 布尔值、布尔值 + 整数、整数 + 双精度、双精度 + 双精度等。
所以我使用了该解决方案中的 WeakConformance 和 C 类
sealed trait WeakConformance[A <: AnyVal, B <: AnyVal, C] {
implicit def aToC(a: A): C
implicit def bToC(b: B): C
}
object WeakConformance {
implicit def SameSame[T <: AnyVal]: WeakConformance[T, T, T] = new WeakConformance[T, T, T] {
implicit def aToC(a: T): T = a
implicit def bToC(b: T): T = b
}
implicit def IntDouble: WeakConformance[Int, Double, Double] = new WeakConformance[Int, Double, Double] {
implicit def aToC(a: Int) = a
implicit def bToC(b: Double) = b
}
implicit def DoubleInt: WeakConformance[Double, Int, Double] = new WeakConformance[Double, Int, Double] {
implicit def aToC(a: Double) = a
implicit def bToC(b: Int) = b
}
}
case class C[A <: AnyVal](val value:A) {
import WeakConformance.unify
def +[B <: AnyVal, WeakLub <: AnyVal](that:C[B])(implicit wc: WeakConformance[A, B, WeakLub], num: Numeric[WeakLub]): C[WeakLub] = {
new C[WeakLub](num.plus(wc.aToC(x), wc.bToC(y)))
}
}
这是我的翻译的一部分
class Interpreter {
......
def eval(e: Expression): Any = e match {
...
case ADD(lhs, rhs) => (eval(lhs), eval(rhs)) match {
case (l: C[_], r: C[_]) => l + r // error comes here
case _ => error("...")
}
}
}
错误是这样的
错误:不明确的隐含值:// 显示 2 最后一个在Numeric
trait 中声明为隐式的对象与预期类型匹配Numeric[WeakLub]
任何想法如何使它工作?我想让 eval 方法返回C
,但因为C[Int]
它不是它的实例C[Any]
并不能解决我的问题