我有一個函數的用例,該函數通過任何類型(任何T
的TraversableOnce[T]
)進行參數化。我試圖用Scalac無法編譯通過TraversableOnce [_]參數化的函數,而元素類型爲
def test[T, F[_] <: TraversableOnce[_]](ts: F[T]): Unit = {
ts.foldLeft("")((acc: String, t: T) => if (acc.isEmpty) t.toString else acc + "," + t.toString)
}
但Scalac中,我已經發現了奇怪的方式抱怨:
<console>:8: error: type mismatch;
found : (String, T) => String
required: (String, _$1) => String
ts.foldLeft("")((acc: String, t: T) => if (acc.isEmpty) t.toString else acc + "," + t.toString)
現在我知道我可以使用約束F[T] <: TraversableOnce[T]
,但我想明白爲什麼Scalac能不適用於我剛剛編寫的函數版本。 ts
的類型是F[T]
,因此foldLeft
的第二個參數的類型應該是(String, T) => String
而不是(String, _$1) => String
而_$1
是未知的。這裏發生了什麼?
SOM-snytt應該獲得榮譽,在這一個正確的答案。我最初誤解了這個問題,然後回去編輯我的答案,以實際回答你的問題。但是在我糾正自己之前,som-snytt正確回答了。 –