2017-02-23 104 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)