Arrays 在Scala函数中接收Int或Double数组
我有以下标准化功能:Arrays 在Scala函数中接收Int或Double数组,arrays,scala,function,functional-programming,Arrays,Scala,Function,Functional Programming,我有以下标准化功能: ... private def NormalizeValues(dataValues: Array [Double]): Array[Double] = { val min = dataValues.min val max = dataValues.max dataValues.map(v => (v - min) / (max - min)) } ... 我希望它能够工作,无论它接收的是一个Double数组还是一个Int数组。总比将Int数组转换为Double数组
...
private def NormalizeValues(dataValues: Array [Double]): Array[Double] = {
val min = dataValues.min
val max = dataValues.max
dataValues.map(v => (v - min) / (max - min))
}
...
我希望它能够工作,无论它接收的是一个Double数组还是一个Int数组。总比将Int数组转换为Double数组好,我想一定有更好的方法可以做到这一点,可能是使用更通用的类型,或者指定Array[Doubles]
和Array[Int]
可以被模糊地接收,在函数定义中
你有什么想法吗?这是一个版本,它将所有输入转换为双倍的
,然后完全按照原始代码进行操作:
def normalize[N: math.Numeric](data: Array[N]): Array[Double] = {
val num = implicitly[Numeric[N]]
val dataValues = data.map(num.toDouble)
val min = dataValues.min
val max = dataValues.max
dataValues.map(v => (v - min) / (max - min))
}
返回类型总是Array[Double]
,因为对于Int
s、Long
s和所有其他整数类型,返回Array[N]
似乎没有任何意义
例如:
normalize(Array[Int](0, 1, 3))
// returns: Array[Double]
// Array(0.0, 0.3333333333333333, 1.0)
您想在这种情况下使用Int
的/
?我想不会吧,[0,1,3]
会发生什么<代码>最小值=0
,最大值=3
,(1-0)/(3-0)=1/3
。它不是一个整数。你是想绕着它转,还是想在地板上,还是想在天花板上,还是想做别的事情?整数不是a,因此,Double
s和Int
s没有共享好的超类/类型类/接口。这只是预处理算法类部分的函数部分。不要担心不确定的情况,NaN值在算法中处理:)在标题和文本中有两个稍微不同的问题。在标题中,您询问的是“Int或Double数组”(即类似于数组[Int | Double]
),而在文本中,您询问的是“Double数组或Int数组”(即类似于数组[Int]|数组[Double]
)。[请注意,这些实际上是Dotty中的合法类型,因此在Scala 3中也可能是这样。]要在Scala中实现这一想法,请参阅以下问题的精彩答案: