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)
但是,如果我尝试对 a 做同样的事情,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
因为我不需要记住我的所有结果。
这似乎是一个奇怪的要求。我想这样做的原因foldLeft
是因为执行视图提供Traversable
了一种有效的方法来实现惰性深度优先搜索。