【问题标题】:Why does Numeric treat unary differently to binary?为什么 Numeric 对待一元与二元的方式不同?
【发布时间】:2013-08-20 02:10:10
【问题描述】:

这是怎么回事?

import Numeric.Implicits._

def myAdd[T: Numeric](x: T, y: T) = x + y   // Works
myAdd(1,2)

def myInc[T: Numeric](x: T) = x + 1   // Fails at x: could not find implicit value for parameter num: scala.math.Numeric[Any]
myInc(9)

Scala 2.10

与 x+1 有什么关系 --> Numeric+Int?

【问题讨论】:

  • 是的,因为如果你删除 + 1 或替换为 x + x 你会看到它编译得很好。

标签: scala


【解决方案1】:

所以在查看了http://www.scala-lang.org/api/current/#scala.math.NumericonefromInt 之后,我在REPL 中摆弄了一下并想出了:

scala> def myInc[T: Numeric](x: T) = x + implicitly[Numeric[T]].fromInt(1)
myInc: [T](x: T)(implicit evidence$1: Numeric[T])T

scala> myInc(9)
res1: Int = 10

scala> def myInc[T: Numeric](x: T) = x + implicitly[Numeric[T]].one
myInc: [T](x: T)(implicit evidence$1: Numeric[T])T

scala> myInc(9)
res2: Int = 10

这与它是具有一个参数的方法无关,而是与将T 类型推断为Any 的编译器有关。

【讨论】:

    【解决方案2】:

    是的,IntNumeric 的常用类型是 Any

    使用这个:

    def myInc[T: Numeric](x: T) = x + implicitly[Numeric[T]].one
    

    还有 fromInt 的成员 Numeric 你可能会觉得有用。

    【讨论】:

    • 在“Int 和 Numeric 的通用类型”中,请注意在 x + 1 中您没有类型 NumericInt,编译器会为其找到通用超类型。 xT 类型,1Int 类型。
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2022-10-19
    • 2014-08-23
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多