2015-12-13 81 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

相關問題