Scala函数中抽象类型的解析

时间:2019-04-25 07:24:53

标签: scala

我是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

有人可以启发我吗?

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

问题是func6试图将类型A的值添加到类型B的值。或更具体地说,它正在尝试使用类型为+的参数在类型为A的对象上调用方法BAB都可以是任何类型,实际上没有通用的方法可以将两个对象“添加”在一起。

因此,您可能会期望此操作失败,因为+上没有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)