Scala 以通用的方式处理数字。解析与分割
因此,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]() {
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
}