非常感谢,Łukasz。这很明显,但我没有想到。这是我放在一起的(非常简单):
trait Valuable[X] {
def plus(x: X, y: X): X
def times(x: X, y: X): X
def minus(x: X, y: X): X
def fromString(x: String): X
}
object Valuable {
implicit object ValuableDouble extends Valuable[Double] {
def plus(x: Double, y: Double): Double = x + y
def times(x: Double, y: Double): Double = x * y
def minus(x: Double, y: Double): Double = x - y
def fromString(x: String): Double = x.toDouble
}
implicit object ValuableInt extends Valuable[Int] {
def plus(x: Int, y: Int): Int = x + y
def times(x: Int, y: Int): Int = x * y
def minus(x: Int, y: Int): Int = x - y
def fromString(x: String): Int = x.toInt
}
}
大概,我真正应该做的就是扩展Numeric,或者Fractional只是为了添加到fromString方法中。
我的解析器组合器现在的代码看起来像这样(这里非常简化):
import Valuable._
trait MyValue {
def asValuable[X : Valuable]: X
}
case class MyExpression(s: String) extends MyValue {
override def asValuable[X: Valuable]: X = implicitly[Valuable[X]].fromString(s)
}
我可以这样测试它:
"1" should "produce 1 for Int and 1.0 for Double" in {
val x = MyExpression("1")
x.asValuable[Int] shouldBe 1
x.asValuable[Double] shouldBe 1.0
}
一切都按预期进行。