我想在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。