如何从String创建多态数值

时间:2016-06-05 14:44:19

标签: scala

我希望能够从字符串生成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]会是一个更好的回复类型,但现在不要担心这个。)

1 个答案:

答案 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
}

一切都按预期工作。