使用Numeric [A]类型的隐式参数似乎被忽略了

时间:2015-03-01 20:12:58

标签: scala type-parameter implicit-parameters

作为Scala的新手,我正在玩foldreducescan。我想看看在函数参数上传递元素的顺序以及最终结果的组装方式。由于我计划在数字和字符串列表中使用它,我使用类型参数定义了以下辅助函数:

scala> def vizAdd[A](p1:A, p2:A):A = {
 |   val res:A = p1 + p2
 |   println( s" * ($p1, $p2) => $res" )
 |   res
 | }
<console>:8: error: type mismatch;
 found   : A
 required: String
       val res = p1 + p2
                      ^

发布Addition with generic type parameter in Scala提出了一个解决方案,重点关注+方法应该需要数字类型来操作的事实,因此向方法添加类型为Numeric [A]的隐式参数应该可以解决问题。不幸的是:

scala> def vizAdd[A](p1:A, p2:A)(implicit n: Numeric[A]):A = {
 |   val res:A = p1 + p2
 |   println( s" * ($p1, $p2) => $res" )
 |   res
 | }
<console>:8: error: type mismatch;
 found   : A
 required: String
         val res:A = p1 + p2
                          ^

[A:Numeric]代替(implicit n: Numeric[A])的语法不起作用......

编译在前面提到的post(下面的代码)中实现的单例对象“GenericTest”会导致相同的错误:“found:A,required:String”。

object GenericTest extends App {
  def func1[A](x: A, y: A)(implicit n: Numeric[A]): A = x + y    
}

我在这里缺少什么?

我正在使用Scala 2.11.5

1 个答案:

答案 0 :(得分:3)

Numeric特征包含plustimes等方法,使用方式如下:

def func1[A](x: A, y: A)(implicit n: Numeric[A]): A = n.plus(x, y) 

您正在寻找的是一种隐式转换,可以丰富A以进行中缀操作,例如+*等,即此一个:

import scala.math.Numeric.Implicits.infixNumericOps

def func1[A](x: A, y: A)(implicit n: Numeric[A]): A = x + y

或者更多的语法糖:

def func1[A: Numeric](x: A, y: A): A = x + y