3
我正在编写一个解释器,并尝试使用来自how-to-set-up-implicit-conversion-to-allow-arithmetic-between-numeric-types的解决方案来解决同样的问题,我需要能够添加布尔+布尔,Int +布尔,布尔+ Int,Int +双人,双+双等如何在我的Interpreter中使用类型的隐式转换
所以我将使用该解决方案
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)))
}
}
WeakConformance和C类,这里是我的翻译的部分
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("...")
}
}
}
错误就是这样
错误:不明确的隐含值://声明显示在这里Numeric
特质隐含最后2个对象匹配,期望型Numeric[WeakLub]
任何想法如何使它工作吗?我想使eval方法返回C
但由于C[Int]
不是C[Any]
一个实例它并没有解决我的问题
是的,我知道清单。我只是希望你会建议一种方法来做到这一点。这是否意味着我的eval方法应该使用清单而不是C返回一对C? – Tala 2010-06-23 15:21:37
我的意思是你的_C_应该保留一个清单。尝试像这样声明:case class C [A <:AnyVal](val value:A)(隐式man:Manifest [A])',并使用这些清单将它们转换为适当的类型。 – 2010-06-23 17:12:22
我按照你的建议改变了我的C班,但问题仍然存在。你能告诉我如何修改上面显示的解释器代码吗? – Tala 2010-06-24 09:32:11