type trait functions classes basics scala tree types

trait - scala type



Scala: trabajando en torno a la "referencia cĂ­clica ilegal" (2)

Estoy intentando implementar un árbol basado en HashMap que admitiría la búsqueda O (1) de subárbol para una clave raíz dada. Para ese objetivo, estoy tratando de hacer lo siguiente:

scala> type Q = HashMap[Char, Q] <console>:6: error: illegal cyclic reference involving type Q type Q = HashMap[Char, Q] ^

Entonces, la pregunta es, ¿hay alguna manera de que yo pueda hacer algo por el estilo sin recurrir al feo HashMap[Char, Any] con el posterior lanzamiento de valores a HashMap[Char, Any] ?

Ahora, también veo que puedo usar algo como lo siguiente para evitar el error de referencia cíclica, e incluso podría ser más limpio, pero sería bueno descubrir cómo hacerlo correctamente de la primera manera, solo para el valor educativo.

import collections.mutable.HashMap class LTree { val children = new HashMap[Char, LTree] }

Gracias un montón.


Probablemente no "entiendo" la pregunta, pero ¿qué pasa?

class L { type Q = java.util.HashMap[Char, this.type] }

o

class Q extends java.util.HashMap[Char, Q]


Para los tipos que no puede extend , como Either , también puede usar un contenedor trivial:

class MyEither(get: Either[String, MyEither])

o, un árbol recursivo con Either (algo que me llevó a este hilo):

// represents (validation) errors for a tree structure of nested dictionaries type FieldName = String type Error = String type Errors = List[(FieldName, FieldError)] case class FieldError(val get: Either[Error, Errors])

que es la versión tipo legal de este pseudo-código:

type Error = String type Errors = List[(FieldName, Either[Error, Errors])]

Entonces, todas sus llamadas a la Left(...) y a la Right(...) se convertirían en FieldError(Left(...)) y FieldError(Right(...)) respectivamente, de modo que, por ejemplo, FieldError(Right(x)).get == Right(x) .