scala - 如何在 Scala 中实现通用数学函数

标签 scala polymorphism

我刚刚开始使用 Scala,而我认为应该很容易理解的东西很难弄清楚。我正在尝试实现以下功能:
def square(x:Int):Int = { x * x }
这工作得很好,但如果我想尝试使这个函数适用于任何类型的数字,我希望能够执行以下操作:
def square[T <: Number](x : T):T = { x * x }
这提示并说:错误:值*不是类型参数T的成员

我需要为此实现一个特征吗?

最佳答案

那是我的 first questions 之一在 Stack Overflow 或关于 Scala 中。问题在于 Scala 保持与 Java 的兼容性,这意味着它的基本数字类型等同于 Java 的原语。

问题在于Java原语不是类,因此没有允许“数字”父类(super class)型的类层次结构。

说得更清楚一点,Java 以及因此的 Scala 在 Double 之间没有任何共同点。的+和一个 Int+ .

Scala 最终绕过这个限制的方法是使用 Numeric , 及其子类 FractionalIntegral ,在所谓的类型类模式中。基本上,您可以像这样使用它:

def square[T](x: T)(implicit num: Numeric[T]): T = {
    import num._
    x * x
}

或者,如果您不需要任何数字操作,但您调用的方法需要,您可以使用上下文绑定(bind)语法进行类型声明:
def numberAndSquare[T : Numeric](x: T) = x -> square(x)

有关更多信息,请参阅我自己的问题中的答案。

关于scala - 如何在 Scala 中实现通用数学函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4056452/

相关文章:

javascript - 在scala js中导入电子浏览器窗口

使用死亡钻石进行 C++ 打印

Java/返回动态对象类型

scala - scala-js 的无形端口 : create artifact with few external dependencies

C#多态与克隆

C++ 理解仿函数多态性

C++ : Multiple inheritance with polymorphism

exception - 并发程序中具有不可变 Map 的 Scala 错误?

scala - 通过将带有参数的方法传递给 "become"来更改 Akka actor 状态

java - 当子项调整大小时调整 JFrame 大小 : how to keep up?