Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与Scala'的比较;什么是数字类型?_Scala_Math_Numeric - Fatal编程技术网

与Scala'的比较;什么是数字类型?

与Scala'的比较;什么是数字类型?,scala,math,numeric,Scala,Math,Numeric,如何创建一个类来对Scala中的任何数值类型进行数学比较 一个明显的方法是: import math.Numeric.Implicits._ class Ops[T : Numeric] { def add(a: T, b: T) = a + b def gt(a: T, b: T) = a > b } 这是我应得的 Ops.scala:7: value > is not a member of type parameter T 嗯。。。我们可以用数字类型做数学

如何创建一个类来对Scala中的任何数值类型进行数学比较

一个明显的方法是:

import math.Numeric.Implicits._

class Ops[T : Numeric] {
    def add(a: T, b: T) = a + b
    def gt(a: T, b: T) = a > b
}
这是我应得的

Ops.scala:7: value > is not a member of type parameter T
嗯。。。我们可以用数字类型做数学运算,但我们不能比较它们

也就是说,
T
有序的[T]

class Ops[T <: Ordered[T] : Numeric] {
    def add(a: T, b: T) = a + b
    def gt(a: T, b: T) = a > b
}
我得到

Ops.scala:13: type arguments [Int] do not conform to class Ops's type parameter bounds [T <: Ordered[T]]

Ops.scala:13:type参数[Int]不符合类Ops的类型参数界限[T您必须导入
mkNumericOps
和/或
mkOrderingOps

val num = implicitly[Numeric[T]]

然后:

现在您可以与它们进行比较和计算。 也许这有助于你回答问题的第一部分

顺便说一下:有序和数字的工作原理如下:

class Ops[T: Ordered: Numeric]

这将是
T:Ordering:Numeric
(或者
T@Tim我自己也遇到了你的问题,我认为应该有一种方法来避免调用
gt
那么笨拙。所以我看了一下API,发现了一个神秘的
mkOrderingOps
…总是仔细看一下API!应该说,你不需要
T
来排序
就可以了。所以它是有效的。)fices应该有
T:Numeric
。正如迪迪尔德指出的,
有序的
将被用作这里的视图绑定(
T是的,我也尝试过使用
gt
,但甚至可以让它工作。正如我在下面所说的,我只是在加快速度,对于导入num的原因仍然有点困惑。{mkNumericOps,mkOrderingOps}
工作。这是如何在其他变量上导入中缀运算符的?@Tim:
mkNumericOps
是从类型
N
到类型
Op
的隐式转换(其中
N
是一些
Numeric
类型)。此类
Op
包含中缀数字运算符。换句话说,代码中的
a+b
将减为
mkNumericOps(a)。+(b)
.Nice,没有意识到与本地导入相比的那种全局导入
numeric.mkXXXOps
。将使用它。
numeric
扩展
排序
,因此请求
排序
上下文边界是多余的!
t:numeric
就足够了。@Sciss很好的观点!是我说的应该有一个上下文边界吗仔细看看API?!还没有仔细看清楚
Numeric我猜Numeric必须以某种方式排序(这就是为什么我在下面的评论中感到如此困惑)。我也不知道排序的含义。(刚刚开始。)
class Ops[T](implicit num: Numeric[T]) 
import num.{mkNumericOps,mkOrderingOps}
class Ops[T: Ordered: Numeric]
scala> import Ordering.Implicits._
import Ordering.Implicits._

scala> import Numeric.Implicits._
import Numeric.Implicits._

scala> class Ops[T : Numeric] {
     |   def add(a: T, b: T) = a + b
     |   def gt(a: T, b: T) = a > b
     | }
defined class Ops

scala> new Ops[Int].gt(12, 34)
res302: Boolean = false