gpt4 book ai didi

伴随对象中的Scala隐式Numeric [T]

转载 作者:行者123 更新时间:2023-12-04 13:28:27 25 4
gpt4 key购买 nike

我有以下通用 Interval 类(由用户 soc 为我制定):

case class Interval[T](from: T, to: T)(implicit num: Numeric[T]) {
import num.mkNumericOps // allows us to write from.toDouble and to.toDouble
def mid: Double = (from.toDouble + to.toDouble) / 2.0
}

典型用例:Interval[Double] 或 Interval[Int]。为了添加二元联合和交集运算符,我遵循了与 (implicit num: Numeric[T]) 类似的模式。在伴随对象中:
object Interval {

def union[T](interval1: Interval[T], interval2: Interval[T])(implicit num: Numeric[T]) = {
import num.mkOrderingOps // allows interval1.from min
Interval[T](interval1.from min interval2.from, interval1.to max interval2.to)
}

def intersect[T](interval1: Interval[T], interval2: Interval[T])(implicit num: Numeric[T]) = {
import num.mkOrderingOps
Interval[T](interval1.from max interval2.from, interval1.to min interval2.to)
}

}

复制 (implicit num: Numeric[T]) 是丑陋的样板和 import num.mkOrderingOps在这两种方法中。有没有办法在 Interval 对象本身的级别上只做一次?

最佳答案

就在这里。

首先是导入。您可以改为在 Interval 范围内导入 Ordering.Implicits._ 。

object Interval {
import Ordering.Implicits._

def union[T](....)(implicit num: Numeric[T]) = {
// do not import num.mkOrderingOps
...
}
...
}

有了这些隐式,当它找到一个排序操作时,它会在操作发生的范围内寻找隐式排序(数字是排序)。在您的每个例程中,恰好都有一个适当的隐含范围。如果您也需要算术运算,还可以导入 Numeric.Implicits._

现在有了隐含的论点。语言中有一个快捷方式,称为上下文绑定(bind):
你可以写 def f[T: X](args)而不是 def f[T](args)(implicit someName: X[T])
不同之处在于您没有上下文绑定(bind)的隐式名称(您可以使用 implictly[T] 但这几乎不会更短。幸运的是,您不再需要使用 import Ordering.Implicits._ 的名称

所以
object Interval {
import Ordering.Implicits._
// also import Numeric.Implicits._ if you need +,-,*,/ ...
def union[T: Numeric] ...
def intersection[T: Numeric] ...
}

关于伴随对象中的Scala隐式Numeric [T],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10569974/

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