2010-06-23 58 views
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]一个实例它并没有解决我的问题

回答

1

因为类型擦除,你不能在运行时检索C类型参数。您需要使用清单来存储该信息。查看与清单和类型删除相关的问题。

+0

是的,我知道清单。我只是希望你会建议一种方法来做到这一点。这是否意味着我的eval方法应该使用清单而不是C返回一对C? – Tala 2010-06-23 15:21:37

+0

我的意思是你的_C_应该保留一个清单。尝试像这样声明:case class C [A <:AnyVal](val value:A)(隐式man:Manifest [A])',并使用这些清单将它们转换为适当的类型。 – 2010-06-23 17:12:22

+0

我按照你的建议改变了我的C班,但问题仍然存在。你能告诉我如何修改上面显示的解释器代码吗? – Tala 2010-06-24 09:32:11