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,尤其是关于类型类的部分。无论如何,这只是一本优秀的书,我强烈建议您阅读整本书以充分了解这些想法的来源。