【问题标题】:How to create a polymorphic numeric value from a String如何从字符串创建多态数值
【发布时间】:2016-06-05 14:44:19
【问题描述】:

我希望能够从字符串生成 X 的值,其中 X <: numeric x>

下面是一些按预期工作的类似代码:

def unity[X : Numeric]: X = implicitly[Numeric[X]].one
val x = unity[Int]

这导致 x 是一个值为 1 的 Int。

现在,我真正想做的是实现以下方法:

def valueOf[X : Numeric](s: String): X = ???

有什么建议吗? (可能 Try[X] 会是更好的返回类型,但我们暂时不用担心)。

【问题讨论】:

  • 也许可以代替Numeric,为可以从字符串解析的对象创建另一个类型类,并为要使用它的类型实现它。

标签: scala


【解决方案1】:

非常感谢,Ł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
}

一切都按预期进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多