更高级的数学与Scala的数字和分数

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参数的任意函数).

所以,我的问题是:我如何将我转换ADouble,对此做数学,然后转换回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遗骸的问题.

0__*_*0__ 6

我仍然怀疑这种方法真的很有用.但是根据你的描述,你会想要这样的东西:

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)