gpt4 book ai didi

scala - 同时适用于 Int 和 Long 的通用隐式类

转载 作者:行者123 更新时间:2023-12-02 12:47:47 25 4
gpt4 key购买 nike

我想通过添加一些辅助方法来为 Scala 中的自然数创建一个“pimp my type”。

我的第一次尝试是为 Int 创建一个,为 Long 创建一个(后来也可能为 BigInt 创建一个)

  implicit class SuperInt(n:Int) {
def square = n * n
def pow(m: Int) = math.pow(n,m)
def **(m: Int) = pow(m)
def sqrt = math.sqrt(n)
def isEven = dividesBy(2)
def isOdd = !isEven
def dividesBy(m:Int) = n % m == 0
}

implicit class SuperLong(n:Long) {
def square = n * n
def pow(m: Int) = math.pow(n,m)
def **(m: Int) = pow(m)
def sqrt = math.sqrt(n)
def isEven = dividesBy(2)
def isOdd = !isEven
def dividesBy(m:Int) = n % m == 0
}

当然,完全相同的代码,不是太干,而且“感觉”不正确。

所以我的问题是 - 同时对 Long、Int 和 BigInt 执行此操作的(惯用)Scala 方法是什么?

<小时/>

附:这是我到目前为止所尝试的,它有点有效,但我很确定它不惯用并且有很多问题。

以下是阅读一些有关“类型类”的结果here (我仍然不完全觉得我100%理解)所以这就是结果(如果你的眼睛受伤了,请原谅我,我对Scala还比较陌生)

  implicit class SuperNumber[A : Numeric](i: A) {
import Numeric.Implicits._
def squared: A = i * i
def pow(m: Int) = math.pow(i.toDouble(),m)
def **(m: Int) = pow(m)
def sqrt = math.sqrt(i.toDouble())
def isEven = dividesBy(2)
def isOdd = !isEven
def dividesBy(m:Int) = {
i match {
case n @ (_:Int | _:Long) => n.toLong() % m == 0
case other => {
val asDouble = other.toDouble()
val asLong = other.toLong()
if (asDouble == asLong) {
asLong % m == 0
} else {
false
}
}
}
}
}

(我添加了对非 Int 和 Long 的“支持”,因为它看起来不太难)

最佳答案

你所拥有的看起来非常接近。一些评论:

您想要的类型类是Integral,而不是Numeric

不要将上下文绑定(bind)编写为[A: Integral],而是在构造函数上放置一个隐式参数,以便您可以从该对象导入mkNumericOps:

implicit class SuperNumber[A](i: A)(implicit integral: Integral[A]) {

import integral._

关于scala - 同时适用于 Int 和 Long 的通用隐式类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17642685/

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