Seq [A]的scala自定义遍历

scala custom traversable of Seq[A]

我正在尝试让我的图形为其边实现 Traversable。 我有一种叫做 Edge[Node, EdgeType] 的边。 我的优势是最后一个案例class。 代码如下所示:

class Graph[Node, Type] extends Traverasble[Edge[Node, Type]]

我看到 this post 关于创建自定义 Traversable,但我无法让它工作。 我的图表知道它是元素 Edge,但不知道它的参数类型 Node 和 EdgeType。我无法让工厂理解那些泛型。

object Graph extends TraversableFactory[Graph] {
    implicit def canBuildFrom[A<:Edge[_,_]]: CanBuildFrom[Coll, A, Graph[_]] = new GenericCanBuildFrom[A]
    def newBuilder[A<:Edge[_,_]] = new ListBuffer[A] mapResult (x => new Graph(x:_*))
}

我尝试使用 higherKinds,但我也看不出如何解决它。

你知道我怎么解决这个问题吗?这个问题 returns 每次带有一些泛型的 class 扩展 Traversable 时,它​​的 Elem 是 class 泛型的组合。

不清楚您要通过实施自定义 TraversableFactory 来实现什么。这些机制是为了支持通用集合,即可以存储 arbitrary 类型元素的集合。这很重要,因为支持的方法包括可以更改元素类型的方法,例如 .map。以下代码中 intColmapped 的预期类型是什么:

val graph: Graph[SomeNode, SomeType] = ???
val intCol = graph.companion.empty[Int]
val mapped = graph.map(edge => 42) // yes fixed value just for an example

intColmapped 绝对应该是 Traversable[Int] 的某个子类型。你能Graph 表示这样一个对象吗?如果不是,则您的 Graph 不是通用集合,不应具有自定义 companion TraversableFactory 对象。

P.S。由于您没有提供任何关于您真正想要实现的目标的描述,因此很难猜测,但您真正想要的可能是继承自 TraversableLike(或 IterableLike)而不是Traversable。主要区别在于 TraversableLike 没有定义 companion 因此可以表示特定于一种类型的集合。