私は scala でコンテキスト境界を試していますが、これら 2 つの関数のいずれかを型チェックする方法が見つかりません。
abstract class Expr
case class Val[T: Numeric](v: T) extends Expr
case object Other extends Expr
val e1 = Val(1)
val e2 = Val(2)
def addExp1(e1: Expr, e2: Expr): Expr = (e1, e2) match {
case (Val(v1), Val(v2)) => Val(v1+v2)
case _ => Other
}
def addExp2[T: Numeric](e1: Expr, e2: Expr): Expr = (e1, e2) match {
case (Val(v1: T), Val(v2: T)) => Val(v1+v2)
case _ => Other
}
addExp1 の場合、Val の引数が Numeric であり、したがって + メソッドがあることを知るための情報が関数定義ポイントにないことがわかります。v1 のタイプとして Any に一致するだけです。
addExp2 の場合、パターンの境界を強制するにはどうすればよいですか? 型は「消去」されます... T 注釈は消去によって削除されます...
私が夢見ているのは、理想的には Val クラスの定義に境界を置くための単一のポイントです。