gpt4 book ai didi

scala - 使用 Scala 值类定义新的数字类型

转载 作者:行者123 更新时间:2023-12-02 01:40:11 24 4
gpt4 key购买 nike

当我第一次听说值类时,我想——终于!现在我可以定义我自己的数字类型而无需对象分配!但结果比我想象的要难。

我想定义我自己的 Decimal 类型,Dec64 ( http://dec64.com/ ) 或用于快速货币计算的 long-backed decimal。但是,AnyVal 不能扩展 Numeric,因为 Numeric 不是通用特征。我试图跟进 Double 的 Scala 代码,但它相当复杂,有 AnyValCompanionFractionalProxy 和很多 private[ scala] 标记代码,带有非常有用的注释,例如不应在用户代码中扩展。

那么,我该如何正确定义我自己的数值类型,以便与其他 Scala 数字一起使用?

最佳答案

Numeric 是一个类型类,因此您的类不会扩展它。相反,您将为您的类型创建一个类型类的实例。在下面的示例中,为了简单起见,我使用了 Int

final class MyNum(val i: Int) extends AnyVal
object MyNum {
implicit val numeric: Numeric[MyNum] = new Numeric[MyNum] {
override def plus(x: MyNum, y: MyNum): MyNum = new MyNum(x.i + y.i)
override def minus(x: MyNum, y: MyNum): MyNum = new MyNum(x.i - y.i)
override def times(x: MyNum, y: MyNum): MyNum = new MyNum(x.i * y.i)
override def negate(x: MyNum): MyNum = new MyNum(-x.i)
override def fromInt(x: Int): MyNum = new MyNum(x)
override def toInt(x: MyNum): Int = x.i
override def toLong(x: MyNum): Long = x.i.toLong
override def toFloat(x: MyNum): Float = x.i.toFloat
override def toDouble(x: MyNum): Double = x.i.toDouble
override def compare(x: MyNum, y: MyNum): Int = x.i.compare(y.i)
}
}

如果您不熟悉类型类,我会推荐 Learn You A Haskell For Great Good ,特别是关于 type classes 的部分.无论如何,这只是一本很棒的书,我强烈建议您阅读整本书以充分理解这些想法的来源。

关于scala - 使用 Scala 值类定义新的数字类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28961946/

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