Scala 以通用的方式处理数字。解析与分割

Scala 以通用的方式处理数字。解析与分割,scala,Scala,因此,scala中的Numeric[T]type类允许操作+、-和*。但它不提供/操作和fromString::String->Option[T]。我必须写: abstract class NumParser[A] { def unapply(s: String): Option[A] def /(x: A, y: A): A } implicit val doubleParser = new NumParser[Double]() {

因此,scala中的
Numeric[T]
type类允许操作
+
-
*
。但它不提供
/
操作和
fromString::String->Option[T]
。我必须写:

    abstract class NumParser[A] {
      def unapply(s: String): Option[A]
      def /(x: A, y: A): A
    }

    implicit val doubleParser = new NumParser[Double]() {
      import scala.util.Try
      def unapply(s: String): Option[Double] = Try(s.toDouble).toOption
      def /(x: Double, y: Double) = x / y
    }

    ...
每次我都需要以一种通用的方式处理数字

这两种操作都很常见,我想知道我是否遗漏了一些东西,它们是在scala或其他公共库(如scalaz)中实现的,我只是没有注意到这一点

我知道scala有
分数的
积分的
,后者有
/
。但我不能同时使用它们


我希望
/
op是
Int->Int->Int
Int
Double->Double->Double
Double

op,所以基本上你希望能够根据类型做两件不同的事情,除法和quot(整数除法)。然后你必须发明你自己的类型类。您可以简单地包装
整数
分数

// prefer Integral over Fractional
trait LowPriStrangeDiv {
  implicit def fromFractional[A](implicit f: Fractional[A]): StrangeDiv[A] =
    new StrangeDiv[A] {
      def strangeDiv(a: A, b: A): A = f.div(a, b)
    }
}
object StrangeDiv extends LowPriStrangeDiv {
  implicit def fromIntegral[A](implicit i: Integral[A]): StrangeDiv[A] =
    new StrangeDiv[A] {
      def strangeDiv(a: A, b: A): A = i.quot(a, b)
    }
}
trait StrangeDiv[A] {
  def strangeDiv(a: A, b: A): A
}
测试:

或者您忘记了
积分
分数
并定义了个别情况:

object StrangeDiv {
  implicit object IntDiv extends StrangeDiv[Int] {
    def strangeDiv(a: Int, b: Int): Int = a / b
  }
  implicit object DoubleDiv extends StrangeDiv[Double] {
    def strangeDiv(a: Double, b: Double): Double = a / b
  }
}
trait StrangeDiv[A] {
  def strangeDiv(a: A, b: A): A
}

这是一种方法,但它仍然需要反复编写这段代码。你认为
/
运算被设计成不同的
分数
积分
吗?我的动机是,在代码中,您使用相同的符号编写
4/2
4.0/2.0
,因此它应该在单个类型类中表示,尽管我同意操作是不同的那么解析有什么用呢?在这方面,标准库有什么帮助吗?另外,我正在将Haskell示例转换为Scala,我认为Scala能够完成我发布的任务,但我刚刚意识到,在示例中,它们从
numa
转换为
Float
类型约束,所以这就稍微解释了一些事情。如果Haskell做不到,scala也可能做不到是的,我认为它们是分开的,因为不清楚分数除法的整数等价物是什么,整数商的浮点等价物是什么。基本运算符
/
继承自Java。我不知道有一个用于字符串解析的标准类型类。还要注意的是,“数字类型,其中/为真除法”和“数字类型,其中/为楼层除法”之间有相同的区别
object StrangeDiv {
  implicit object IntDiv extends StrangeDiv[Int] {
    def strangeDiv(a: Int, b: Int): Int = a / b
  }
  implicit object DoubleDiv extends StrangeDiv[Double] {
    def strangeDiv(a: Double, b: Double): Double = a / b
  }
}
trait StrangeDiv[A] {
  def strangeDiv(a: A, b: A): A
}