Scala标准库中Numeric
没有maxValue
和minValue
函数的原因是否充分?它似乎相当有用,甚至在某些情况下使用它也是必要的。
例如,一个人可能能够定义一个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))
}
...
答案 0 :(得分:9)
Numeric
旨在成为一般性的。有可能不存在最大值的原因:数量可能是任意大的(例如BigInt
),即使有实际限制,您可能也不希望机器磨损,因为它试图表示它;最大值实际上可能不在数字的范围内(例如半开区间[0, 1)
);或者您可能有一个不存在最大值的数字类型(例如复杂),但其他操作可以使其具有足够的意义来实现。
那就是说,人们可以说,“为什么不存在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
。