я следующая функция, которая генерирует Равномерное распределяется значение между 2 границами:Используя двойное значение в методе дробного [T]
def Uniform(x: Bounded[Double], n: Int): Bounded[Double] = {
val y: Double = (x.upper - x.lower) * scala.util.Random.nextDouble() + x.lower
Bounded(y, x.bounds)
}
и Ограниченность определяется следующим образом:
trait Bounded[T] {
val underlying: T
val bounds: (T, T)
def lower: T = bounds._1
def upper: T = bounds._2
override def toString = underlying.toString + " <- [" + lower.toString + "," + upper.toString + "]"
}
object Bounded {
def apply[T : Numeric](x: T, _bounds: (T, T)): Bounded[T] = new Bounded[T] {
override val underlying: T = x
override val bounds: (T, T) = _bounds
}
}
Тем не менее, я хочу Uniform
работать на всех Fractional[T]
значений, так что я хотел бы добавить контекст, связанный:
def Uniform[T : Fractional](x: Bounded[T], n: Int): Bounded[T] = {
import Numeric.Implicits._
val y: T = (x.upper - x.lower) * scala.util.Random.nextDouble().asInstanceOf[T] + x.lower
Bounded(y, x.bounds)
}
Это срабатывает при выполнении Uniform[Double](x: Bounded[Double])
, но другие невозможны и получают исключение ClassCastException во время выполнения, потому что их нельзя отличить. Есть ли способ решить это?
Сколько различных типов 'T' вы ожидаете? Если это ограниченный набор, вы можете рассмотреть возможность создания функции nextRandom [T]. Это работает только в том случае, если вы знаете, какого рода 'T' ожидать. –