gpt4 book ai didi

generics - Scala 泛型和数字隐式

转载 作者:行者123 更新时间:2023-12-04 08:37:33 25 4
gpt4 key购买 nike

我需要将两个函数作为参数传递给 scala 函数。然后该函数应该评估它们并从它们那里得到一个数字,然后在那里进行操作。此数字可以是 Int、Double 或任何其他数字类型。我希望该函数能够工作,无论它使用什么类型。

下面的例子解释了这个问题。

import Numeric.Implicits._

class Arithmetic[T : Numeric](val A: Connector[T], val B: Connector[T]) {
val sum = new Connector({ A.value + B.value })
}

class Constant[T](var x: T) {
val value = new Connector({ x })
}

class Connector[T](f: => T) {
def value: T = f
override def toString = value.toString()
}

object Main extends App{
val n1 = new Constant(1)

// works
val n5 = new Constant(5)
val a = new Arithmetic( n1.value, n5.value )
println(a.sum)

// no works
val n55 = new Constant(5.5)
val b = new Arithmetic( n1.value, n55.value )
println(b.sum)

}

我也试过
class Arithmetic[T,R : Numeric](val A: Connector[T], val B: Connector[R]) {

和其他几种组合,但我最终得到了
error: could not find implicit value for parameter num: scala.math.Numeric[Any]
val sum = new Connector({ A.value + B.value })

最佳答案

您看到的错误消息是因为 Numeric[T].plus只能用于将两个相同类型的值相加 T .
您的代码是在数字扩展自动发生的假设下编写的 - 在这种情况下不会发生这种情况,因为编译器除了存在 Numeric[T] 之外,对类型一无所知。实例。

如果您需要 sum要成为一个稳定的值,您必须在构造函数中提供必要的类型信息,如下所示:

class Arithmetic[A : Numeric, R <% A, S <% A](val a: Connector[R], b: Connector[S]) {
val sum = new Connector[A]((a.value:A) + (b.value:A))
}

这需要类型 RS可转换成某种类型 A其中一个 Numeric[A]距离是已知的。
创建实例时,您始终必须提供所有类型参数,因为它们无法推断。

如果您不需要 sum为了稳定,您可以将类(class)更改为:
class Arithmetic[A,B](val a: Connector[A], val b: Connector[B]) {

// if A and B are the same types
def sum(implicit e: B =:= A, n: Numeric[A]): Connector[A] =
new Connector(n.plus(a.value, b.value))

// else widen to C
def wideSum[C](implicit f: A => C, g: B => C, n: Numeric[C]) =
new Connector(n.plus(a.value, b.value))
}

val a = new Connector(1)

val b = new Connector(2)

val c = new Connector(3.0)

val d = (new Arithmetic(a,b)).sum

// val e = (new Arithmetic(b,c)).sum // <-- does not compile

val e = (new Arithmetic(b,c)).wideSum[Double]

扩大时,您仍然需要提供类型信息。

关于generics - Scala 泛型和数字隐式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7765902/

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