我希望能够从字符串生成X的值,其中X <:数字[X]。应从上下文推断出特定类型的X.
这里有一些类似的代码可以按预期工作:
def unity[X : Numeric]: X = implicitly[Numeric[X]].one
val x = unity[Int]
这导致x为值为1的Int。
现在,我真正想要做的是实现以下方法:
def valueOf[X : Numeric](s: String): X = ???
有什么建议吗? (也许,尝试[X]会是一个更好的回复类型,但现在不要担心这个。)
答案 0 :(得分:0)
非常感谢,Ł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
}
一切都按预期工作。