scala пользовательские прохождения Seq [A] - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь, чтобы мой График реализовал Traversable для его краев. У меня есть тип ребра с именем Edge [Node, EdgeType]. Мой край - это последний класс. Код выглядит так:

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

Я видел этот пост о создании пользовательского 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:_*))
}

Я пытался использовать более высокие виды, но я не вижу, как решить это с тем же.

Вы знаете, как я могу решить это? Эта проблема возвращается всякий раз, когда класс с некоторыми обобщениями расширяет Traversable, так как его Elem является составом обобщений класса.

1 Ответ

0 голосов
/ 11 января 2019

Не ясно, чего вы пытаетесь достичь, внедряя пользовательские TraversableFactory. Эти механизмы предназначены для поддержки общих коллекций, то есть коллекций, которые могут хранить элементы типа произвольного . Это важно, потому что поддерживаемые методы включают методы, которые могут изменять тип элемента, например .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, поэтому могут представлять коллекцию, специфичную только для одного типа.

...