2010-06-23 57 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