scala - 为什么 Scala 标准库中的 `Numeric` 没有 `maxValue` ?

标签 scala max standard-library

为什么 Scala 标准库中的 Numeric 没有 maxValueminValue 函数,这是有充分理由的吗?它似乎很有用,甚至在某些情况下有必要使用它。

例如,可以像这样定义一个 scalacheck 生成器:

def arbNumeric[T:Choose](implicit num: Numeric[T): Arbitrary[T] = {
  Arbitrary(Gen.chooseNum(num.MinValue, num.MaxValue))
}

与必须为每个 Int、Long 等写出相同的东西相反:

val arbInt: Arbitrary[Int] = {
  Arbitrary(Gen.chooseNum(Int.MinValue, Int.MaxValue))
}
def arbLong: Arbitrary[Long] = {
  Arbitrary(Gen.chooseNum(Long.MinValue, Long.MaxValue))
}
def arbShort: Arbitrary[Short] = {
  Arbitrary(Gen.chooseNum(Short.MinValue, Short.MaxValue))
}
...

最佳答案

Numeric 是通用的。最大值可能不存在的原因有:数字可能任意大(例如 BigInt),即使存在实际限制,您可能也不希望机器因为它而停止运转试图代表它;最大值可能实际上不在数字范围内(例如半开区间 [0, 1));或者您可能有一个数字类型,其最大值不存在(例如 Complex),但其他操作对于实现它来说足够有意义。

也就是说,人们可以说,“为什么没有 maxValueOption”,答案是:当时没有人需要它。

如果您不想一遍又一遍地重复相同的最大值选择,您可以创建自己的 MaximalValue 类型类。

trait MaximalValue[A] { def value: A }
implicit val MaximalInt = new MaximalValue[Int] { def value = Int.MaxValue }
// Fill in others here

def biggest[A: MaximalValue] = implicitly[MaximalValue[A]].value

> biggest[Int]
res0: Int = 2147483647

这本质上与使用 Numeric 的模式相同,只是您需要 A: Numeric : MaximalValue 而不仅仅是 A: Numeric

关于scala - 为什么 Scala 标准库中的 `Numeric` 没有 `maxValue` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34253746/

相关文章:

Scala代码揭开神秘面纱

Scala 作为 shell 脚本 : jars on the classpath

matlab - 获取矩阵中的前两个最大值

html - 如何在输入类型=日期上设置最小/最大属性

mysql - 根据 MySQL SUM 结果选择最高行,有关系

c++ toupper - 标准函数?

scala - 未找到 : Type Build (Unresolved 'Build' )

安装 Mac OS X Sierra (Mac OS 10.12) 后 Eclipse scala-ide 将无法启动

c++ - 如何将绑定(bind)与通过引用传递的抽象类结合使用

没有 Rails 的 Ruby 的 `.present?`?