我是Scala的新手,试图探索该语言的语法,但是遇到了有关抽象类型的问题。
def func5(x : Int, y : Int): Int = x * y
def func55(x : Double, y : Double): Double = x / y
def func6[A,B](f : (A,A) => A, g: (B,B) => B) :
(Int,Int,Double,Double) => Double = (x,y,a,z) => {f(x,y)+g(a,z)}
func6(func5, func55)(3,4,7.0d,4.2d)
这给了我
+g(a,z)} expected string but given B
有人可以启发我吗?
感谢您的时间。
答案 0 :(得分:2)
问题是func6
试图将类型A
的值添加到类型B
的值。或更具体地说,它正在尝试使用类型为+
的参数在类型为A
的对象上调用方法B
。 A
和B
都可以是任何类型,实际上没有通用的方法可以将两个对象“添加”在一起。
因此,您可能会期望此操作失败,因为+
上没有A
运算符。但是Scala(出于某种原因)确实对所有对象都有+
的通用定义。这个通用的+
的参数类型为String
,但是func6
的类型为B
,这就是为什么会出现错误的原因
找到:B,必填:字符串
答案 1 :(得分:0)
函数f和g是通用函数,它们不将整数或双精度作为参数(仅A和B)。
def func6[A,B](f : (A,A) => A, g: (B,B) => B) :
(A,A,B,B) => (A, B) = (x,y,a,z) => {
(f(x,y),g(a,z))
}
类似的事情会起作用。但是您不能在函数末尾使用'+',因为它没有为类型A和B定义。
您还可以为A和B定义隐式加运算符。
def func5(x : Int, y : Int): Int = x * y
def func55(x : Double, y : Double): Double = x / y
def func6[A,B](f : (A,A) => A, g: (B,B) => B)(implicit plusOperation: PlusOperation[A, B]) :
(A,A,B,B) => B = (x,y,a,z) => {
plusOperation.add(f(x,y),g(a,z))
}
trait PlusOperation[A, B] {
def add(a: A, b: B): B
}
class IntToDoublePlus extends PlusOperation[Int, Double] {
override def add(a: Int, b: Double): Double = a + b
}
implicit val plusOp: PlusOperation[Int, Double] = _ + _
func6(func5, func55).apply(3,4,7.0d,4.2d)