gpt4 book ai didi

scala - 为什么 Numeric 的行为与 Ordered 不同?

转载 作者:行者123 更新时间:2023-12-04 02:57:11 26 4
gpt4 key购买 nike

Scala 有许多可以用作类型类的特征,例如 OrderedNumeric包装内scala.math .

例如,我可以使用 Ordered 编写一个通用方法。像这样:

def f[T <% Ordered[T]](a: T, b: T) = if (a < b) a else b

我想对 Numeric 做类似的事情,但这不起作用:
def g[T <% Numeric[T]](a: T, b: T) = a * b

为什么 Ordered 之间存在明显差异和 Numeric ?

我知道还有其他方法可以做到这一点,以下将起作用(使用上下文绑定(bind)):
def g[T : Numeric](a: T, b: T) = implicitly[Numeric[T]].times(a, b)

但这看起来比仅仅能够使用 * 更复杂。将两个数字相乘。为什么 Numeric trait 不包括像 * 这样的方法, 而 Ordered确实包括像 < 这样的方法?

我知道还有 Ordering您可以像 Numeric 一样使用它, 另见 this answer :
def f[A : Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)

最佳答案

如果从隐式 Numeric[T] 导入符号运算符,则它们可用

def g[T : Numeric](a: T, b: T) = {
val num = implicitly[Numeric[T]]
import num._
a * b
}

如果您只想使用单个运算符,这显然有点笨拙,但在非平凡的情况下,导入的开销并不是那么大。

为什么没有显式导入操作符不可用?默认情况下,反对使隐式可见的通常考虑适用于此,也许更是如此,因为这些运算符被广泛使用。

关于scala - 为什么 Numeric 的行为与 Ordered 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4803485/

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