为什么以下scala实验代码不起作用?

时间:2016-12-19 07:42:34

标签: scala functional-programming

我试图为数值定义一个通用的添加函数:

def add[A](x:A, y:A): A = {
  x + y
}


console:16:错误:类型不匹配;  找一个  必需:字符串          x + y              ^

编译器抱怨什么? 我现在用谷歌搜索的一些内容对我来说并没有多大意义。

2 个答案:

答案 0 :(得分:10)

由于您定义A没有边界且没有额外信息,它可能是任何类型,而且任何Scala类型都没有+方法 - 所以这可以&# 39; t compile。

错误消息是编译器尝试隐式地将 x转换为String的结果(因为String具有+方法,并且每种类型可以使用toString)转换为字符串,但之后失败,因为y不是字符串。

要为所有数字类型创建方法,您可以使用Numeric类型:

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

add(1, 3)
add(1.4, 3.5)

编辑:或等效的语法:

def add[A: Numeric](x:A, y:A): A = {
  implicitly[Numeric[A]].plus(x, y)
}

答案 1 :(得分:2)

为了能够做这样的事情,编译器需要知道A有一个方法

def +(a: A): A

理想情况下,您可能希望执行类似

的操作
def add[A :< Numeric](x:A, y:A): A = { ... 

但你不能,因为Scala中的数字类型没有常见的超类型(它们扩展AnyVal)。查看here以获取相关问题。