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)
.