作为Scala的新手,我正在玩fold
,reduce
和scan
。我想看看在函数参数上传递元素的顺序以及最终结果的组装方式。由于我计划在数字和字符串列表中使用它,我使用类型参数定义了以下辅助函数:
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
答案 0 :(得分:3)
Numeric
特征包含plus
,times
等方法,使用方式如下:
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