Scala - 将Int隐式转换为数字[Int]

Dav*_*den 6 scala numeric scala-2.8

我已经创建了一个类,可以通过任何可以转换为数字的东西进行参数化

class Complex[T <% Numeric[T]] (val real : T, val imag : T) {
   //... complex number methods ...
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试在代码中的其他地方:

var myComplex = new Complex(0, 1)
Run Code Online (Sandbox Code Playgroud)

这会引发编译错误,因为(令人惊讶的是)Int和Numeric [Int]之间甚至Int和Integral [Int]之间都没有隐式转换.

我错过了什么吗?在某处我没有看到隐含的转换吗?

在Numeric.scala中定义了一个名为IntIsIntegral的隐式对象.我尝试使用它来创建自己的隐式转换方法:

def implicit intToNumericInt(val i : Int)(implicit n : IntIsIntegral) = n.fromInt(i)
Run Code Online (Sandbox Code Playgroud)

我很惊讶这是必需的,无论如何,它似乎导致无限递归到.fromInt方法.

我确信我遗漏了一些基本的东西(你可以说,我是Scala的新手),所以我会很欣赏正确的方向.

从示例中可以看出,我正在尝试使用可以接受和使用任何数字类型的复数实现.我希望将此贡献给scalala(线性代数)项目.接下来,我想介绍一个Trait,它描述矩阵中元素的责任(主要是+和*运算符),并将复数的改进支持到矩阵操作库中.

Dan*_*ral 10

你错了.正确的用法是这样的:

class Complex[T](val real : T, val imag : T)(implicit num: Numeric[T]) {
   import num._ // make implicit conversions available
   //... complex number methods ...
}
Run Code Online (Sandbox Code Playgroud)

这是相同的区别在之间OrderedOrdering.一个Ordered[T]实例可以比作T,而一个Ordering[T]提供了比较AA耦合的方法T.

  • @David:`T <%Numeric [T]`是添加`(隐式ev:T => Numeric [T])`的语法糖,而`T:Numeric [T]`是添加`的语法糖(隐式ev:数字[T])`.第一个称为视图绑定,第二个称为类型类绑定. (2认同)
  • @missingfaktor第二个称为上下文绑定,恰好用于类型类模式. (2认同)
  • 不,T <%Numeric [T]是视图边界.它是(隐式f:T => Numeric [T])的语法糖.相比之下,foo [T:Numeric]是语法糖(隐式x:数字[T].这是一个上下文绑定.请参阅http://gist.github.com/257758 (2认同)