2015-12-13 3 views
2

Есть ли веская причина, почему Numeric в стандартной библиотеке Scala не имеет функции maxValue и minValue. Это кажется весьма полезным, даже необходимо использовать его в определенных контекстах.Почему `Numeric` в стандартной библиотеке Scala не имеет` 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

Что будет 'MaxValue'' Numeric [BigDecimal] 'будет? – Marth

+0

Как BigDecimal противоречит этой идее? –

+0

каждый тип «Numeric» имеет разные пределы ... – 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.