我想在Scala中使用foldLeft
運算符連接一系列Traversable
視圖,並且遇到了我不明白的類型差異錯誤。Scala中的類型差異錯誤在遍歷視圖上執行foldLeft時
我可以使用reduce
連接像這樣的Traversable
視圖的列表。
val xs = List(1,2,3,4).map(Traversable(_).view).reduce((a: TraversableView[Int, Traversable[_]], b: TraversableView[Int, Traversable[_]]) => a ++ b) // TraversableView[Int,Traversable[_]]
// xs.force returns Traversable[Int] = List(1, 2, 3, 4)
(請注意,我必須寫上reduce
參數的類型註釋:reduce(_ ++ _)
不能編譯,我不明白爲什麼和將是這方面的一個解釋感激了。)
我也可以將列表分成頭部和尾部並連接起來。
import collection.TraversableView
val ns = List(1,2,3,4)
val h = Traversable(ns.head).view
val t = ns.tail.map(Traversable(_).view).reduce((a: TraversableView[Int, Traversable[_]], b: TraversableView[Int, Traversable[_]]) => a ++ b)
val xs = h ++ t // TraversableView[Int,Traversable[_]]
// xs.force returns Traversable[Int] = List(1, 2, 3, 4)
但是,如果我試圖用foldLeft
做同樣的事情,我會得到類型差異錯誤。
import collection.TraversableView
val ns = List(1,2,3,4)
val h = Traversable(ns.head).view
val t = ns.tail.map(Traversable(_).view)
val xs = (h /: t)((a: TraversableView[Int, Traversable[_]], b: TraversableView[Int, Traversable[_]]) => a ++ b)
<console>:14: error: type mismatch;
found : scala.collection.TraversableView[Int,Traversable[_]]
required: java.lang.Object with scala.collection.TraversableView[Int,Traversable[Int]]
(h /: t)((a: TraversableView[Int, Traversable[_]], b: TraversableView[Int, Traversable[_]]) => a ++ b)
我懷疑這個問題在Traversable[_]
與存在類型做的,但我無法弄清楚到底我做錯了什麼。我已經嘗試了上述表達式中的各種類型簽名無濟於事。從Stackoverflow上的其他問題來看,foldLeft
的鍵入有些棘手,但我找不到解決此問題的問題。
爲了便於比較,使用與Stream
相同的算法無障礙地工作。
val xs = (1 #:: Stream.empty /: List(2,3,4).map(_ #:: Stream.empty))(_ ++ _)
// xs.force returns Stream[Int] = Stream(1, 2, 3, 4)
以上就是我想做的事,但我想用視圖代替Stream
,因爲我並不需要memoize的我所有的結果。
這可能看起來像一個奇怪的要求。 原因我想這樣做是因爲執行foldLeft
而不是Traversable
視圖提供了一種有效的方式來實現lazy depth first search。