2015-12-13 44 views
2

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

举例来说,一个可能是能够定义像这样的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)) 
} 
... 
+3

'Numeric [BigDecimal]'的'MaxValue'会是什么? – Marth

+0

BigDecimal如何抵触这个想法? –

+0

数字的每个“类型”具有不同的限制... – pedrorijo91

回答

9

Numeric是为了一般。存在最大值可能不存在的原因有很多:数量可能是任意大的(例如BigInt),即使存在实际的限制,您可能不希望机器磨碎,因为它试图表示它;最大值可能实际上不在数字的范围内(例如,半开区间[0, 1));或者您可能有一个最大不存在的数字类型(例如Complex),但其他操作可以为其实现足够的意义。

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

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

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

相关问题