gpt4 book ai didi

scala - 使用 Scala 的数字和小数进行更高级的数学运算

转载 作者:行者123 更新时间:2023-12-01 09:04:45 25 4
gpt4 key购买 nike

最近我(终于)开始使用 Scala 的 Numeric trait,这确实很神奇。例如:

def square[A](x: A)(implicit num: Numeric[A]): A = num.times(x, x)

现在我可以对任何数字求平方,无论是 DoubleIntegerBigDecimal 还是其他数字。但是,如果我想做一些更高级的数学怎么办?例如,我的 logistic function Double 数字如下所示:

def logisticFunction(x: Double): Double = 1.0 / (1.0 + math.exp(-x))

我可以轻松地进行加法和除法(我只需要使用特征 Fractional 而不是 Numeric),但是指数呢?我当然不想编写自己的 exp 函数(或任何采用 Double 参数的任意函数)。

所以,我的问题是:如何将我的 A 转换为 Double,对此进行数学运算,然后再转换回 A。有没有可能?

编辑:

这就是我的函数签名的样子:

def logisticFunction[A](x: A)(implicit num: Fractional[A]): A = 
/* Magic happens here */

我已经弄清楚了转换为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))

或使用专用类型类:

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))

关于scala - 使用 Scala 的数字和小数进行更高级的数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17923860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com