Vil*_*tas 2 math scala exponent
最近我(终于)开始使用Scala的数字特征,这确实很奇怪.例如:
def square[A](x: A)(implicit num: Numeric[A]): A = num.times(x, x)
Run Code Online (Sandbox Code Playgroud)
现在我能够勇敢地正视任何数量的吧Double,Integer,BigDecimal,或什么不是.但是,如果我想做更高级的数学怎么办?例如,我的数字逻辑函数Double如下所示:
def logisticFunction(x: Double): Double = 1.0 / (1.0 + math.exp(-x))
Run Code Online (Sandbox Code Playgroud)
我可以轻松地进行添加和分割(我只需要使用trait Fractional而不是Numeric),但是指数呢?我确定不想编写自己的exp函数(或任何带Double参数的任意函数).
所以,我的问题是:我如何将我转换A为Double,对此做数学,然后转换回A.它甚至可能吗?
编辑:
这就是我的函数的签名应该是这样的:
def logisticFunction[A](x: A)(implicit num: Fractional[A]): A =
/* Magic happens here */
Run Code Online (Sandbox Code Playgroud)
我已经找到了关于转换为double的部分,这很简单num.toDouble(x).然而,转换回A遗骸的问题.
我仍然怀疑这种方法真的很有用.但是根据你的描述,你会想要这样的东西:
type FromDouble[A] = Double => A
type ToDouble [A] = A => Double
def logisticFunction[A: FromDouble: ToDouble](x: A): A = 1.0 / (1.0 + math.exp(-x))
logisticFunction(0.5)
implicit def bigDecimalToDouble(b: BigDecimal) = b.toDouble
logisticFunction(BigDecimal(0.5))
Run Code Online (Sandbox Code Playgroud)
或者使用专用类型:
object FromDouble {
implicit object _Double extends FromDouble[Double] {
def apply(d: Double) = d
}
implicit object _BigDecimal extends FromDouble[BigDecimal] {
def apply(d: Double) = BigDecimal(d)
}
}
trait FromDouble[A] extends (Double => A)
object ToDouble {
implicit object _Double extends ToDouble[Double] {
def apply(d: Double) = d
}
implicit object _BigDecimal extends ToDouble[BigDecimal] {
def apply(b: BigDecimal) = b.toDouble
}
}
trait ToDouble[A] extends (A => Double)
def logisticFunction[A: FromDouble: ToDouble](x: A): A = 1.0 / (1.0 + math.exp(-x))
logisticFunction(0.5)
logisticFunction(BigDecimal(0.5))
Run Code Online (Sandbox Code Playgroud)