2017-02-23 118 views
1

我正在尝试编写一个函数,该函数需要函数的Traversable和值的Traversable,并返回应用于这些值的Traversable。当我尝试调用列表和矢量上的函数时,出现类型不匹配错误。这里是我的代码:斯卡拉类型与Traversables不匹配

def applyFunctions[A](x: Traversable[A => A], y: Traversable[A]): Traversable[A] = { 
    for (ys <- y; 
     xs <- x 
     ) yield (xs(ys)) 
} 

然后我尝试使用这个调用这个函数:

transform(List({(x: Double) => x + x}, {(x: Double) => x * 2}), Vector(1,2,3)) 

而且我得到以下错误:

error: type mismatch; 
found : List[Double => Double] 
required: Traversable[AnyVal => AnyVal] 

我认为,名单是一个Traversable的子类,所以我可以在函数定义中使用Traversable。任何帮助,将不胜感激。

回答

1

矢量被解释为矢量[INT],可以声明为矢量[双],因为它应具有相同的类型中的功能的类型A,这是

applyFunctions(List({(x: Double) => x + x}, {(x: Double) => x * 2}), Vector[Double](1,2,3)) 
// res9: Traversable[Double] = Vector(2.0, 2.0, 4.0, 4.0, 6.0, 6.0) 
+0

谢谢,完美的工作! – chrisz

+0

不客气。很高兴它有帮助。 :) – Psidom

0

从函数的所有参数中推导出类型参数A。第一个参数的类型为List[Double => Double],但第二个参数的类型为Vector[Int]DoubleA来自第一个参数)和Int(来自第二个参数的A)的共同祖先是AnyVal,这就是为什么它的最终值为A

要解决您的问题,请将Vector(1,2,3)更改为Vector(1.0,2.0,3.0)

相关问题