gpt4 book ai didi

scala - 类型参数和数字加宽

转载 作者:行者123 更新时间:2023-12-04 15:19:41 26 4
gpt4 key购买 nike

众所周知,我们可以将两个不同的数相加(相减/相乘/等)Numeric类型,结果将是两种类型中较宽的一种,无论它们的顺序如何。

33F + 9L  // Float + Long == Float
33L + 9F // Long + Float == Float

这是因为每个 7 Numeric类 ( Byte , Short , Char , Int , Long , Float , Double | 141|144|7 7 个不同方法(和 +()-() 等),每个 *() 一个可以作为传递参数接收的类型。 [还有一个 Numeric处理 +() 的方法参数,但这不需要我们关注。]

现在考虑以下几点:
implicit class PlusOrMinus[T: Numeric](a: T) {
import Numeric.Implicits._
def +-(b: T) = if (util.Random.nextBoolean) a+b else a-b
}

如果两个操作数的类型相同,则此方法有效,但如果第一个操作数的类型比第二个操作数的类型宽,则此方法也有效。
11F +- 2L  // result: Float = 9.0 or 13.0

我相信这里发生的事情是编译器使用 weak conformance实现 numeric widening在传递给 String 的第二个操作数( b 参数)上方法。

但是第一个操作数不会扩大到匹配第二个操作数。它甚至不会编译。
11L +- 2F  // Error: type mismatch; found: Float(2.0) required: Long

有没有办法解决这个限制?

我不能为 +-() 使用不同的类型参数参数 ( b ) 因为 def +-[U: Numeric](b: U) = ... ,通过类型参数表示,只能加/减它自己的类型。

是使用 7 种不同方法( NumericPlusOrMinusShort/Int/Long/def +-(b:Short) 等)创建 7 个不同类( def +-(b:Int) 等)的唯一解决方案吗?

最佳答案

这是一种方法:

implicit class PlusOrMinus[T: Numeric](a: T) {
import Numeric.Implicits._
def +-(b: T) = plusOrMinus(a,b)
def +-[U: Numeric](b: U)(implicit ev: T => U) = plusOrMinus[U](a,b)

private def plusOrMinus[W: Numeric](a: W, b: W): W =
if (util.Random.nextBoolean) a+b else a-b
}

然后,有了这个,我得到了以下交互:
scala> 11F +- 2L
res0: Float = 9.0

scala> 11L +- 2F
res1: Float = 9.0

这个想法是,如果我能有一个函数 plusOrMinus ,这整个问题将是微不足道的,因为任何一个论点都可能发生相同的扩大。定义了这样的函数后,问题就变成了如何将其嵌入到隐式类中,以中缀形式使用。

在这里,我们只有两种情况:要么需要扩展第二个参数,要么需要扩展由隐式类包装的参数。这些案例中的第一个包含在第一个 +- 中。方法(出于您上面观察到的原因)。然而,对于第二个,我们需要明确说明有一些转换是可能的,并将转换的泛型类型传递给 plusOrMinus .

关于scala - 类型参数和数字加宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39277033/

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