3

私はインタープリターを書いていて、 ブール値+ブール値、整数を追加できるようにする必要がある同じ問題に対して、ハウツーセットアップ-暗黙的変換-to-allow-算術-数値型からのソリューションを使用しようとしました+ Boolean、Boolean + Int、Int + Double、Double + Double など

そのため、そのソリューションの 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("...")
    }
  }

}

エラーはそのようなものです

Numericエラー: あいまいな暗黙的な値: //ここでトレイトで暗黙的として宣言された最後の 2 つのオブジェクトが期待される型と一致することを示しますNumeric[WeakLub]

それを機能させる方法はありますか?eval メソッドを返すようにしたかったのですCC[Int]、そのインスタンスでC[Any]はないため、問題は解決しません

4

1 に答える 1

1

型消去のため、実行時に の型パラメーターを取得できませんC。その情報を保存するには、マニフェストを使用する必要があります。マニフェストと型消去に関する質問を参照してください。

于 2010-06-23T15:14:11.840 に答える