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
。以下代码中 intCol
和 mapped
的预期类型是什么:
val graph: Graph[SomeNode, SomeType] = ???
val intCol = graph.companion.empty[Int]
val mapped = graph.map(edge => 42) // yes fixed value just for an example
intCol
和 mapped
绝对应该是 Traversable[Int]
的某个子类型。你能Graph
表示这样一个对象吗?如果不是,则您的 Graph
不是通用集合,不应具有自定义 companion
TraversableFactory
对象。
P.S。由于您没有提供任何关于您真正想要实现的目标的描述,因此很难猜测,但您真正想要的可能是继承自 TraversableLike
(或 IterableLike
)而不是Traversable
。主要区别在于 TraversableLike
没有定义 companion
因此可以表示特定于一种类型的集合。
我正在尝试让我的图形为其边实现 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
。以下代码中 intCol
和 mapped
的预期类型是什么:
val graph: Graph[SomeNode, SomeType] = ???
val intCol = graph.companion.empty[Int]
val mapped = graph.map(edge => 42) // yes fixed value just for an example
intCol
和 mapped
绝对应该是 Traversable[Int]
的某个子类型。你能Graph
表示这样一个对象吗?如果不是,则您的 Graph
不是通用集合,不应具有自定义 companion
TraversableFactory
对象。
P.S。由于您没有提供任何关于您真正想要实现的目标的描述,因此很难猜测,但您真正想要的可能是继承自 TraversableLike
(或 IterableLike
)而不是Traversable
。主要区别在于 TraversableLike
没有定义 companion
因此可以表示特定于一种类型的集合。