Ésta es una buena (y bastante simple) la aplicación de la clase de técnicas de programación genéricas ejemplificado en shapeless.
Dada su definición,
object CombinatorParser extends RegexParsers {
lazy val a = "a"
lazy val b = "b"
lazy val c = "c"
lazy val content = a ~ b ~ c
}
Podemos definir de forma recursiva una clase de tipo que aplanarlo de resultados de la siguiente manera,
import CombinatorParser._
Primero definimos un rasgo que (en abstracto) se aplana un partido arbitraria M
a un List[String]
,
trait Flatten[M] extends (M => List[String]) {
def apply(m : M) : List[String]
}
T gallina proporcionamos instancias de la clase de tipo para todas las formas de M
que nos interesan: en este caso, String
, A ~ B
y ParseResult[T]
(donde A
, B
y T
son todos los tipos para los que no son Flatten
casos),
// Flatten instance for String
implicit def flattenString = new Flatten[String] {
def apply(m : String) = List(m)
}
// Flatten instance for `A ~ B`. Requires Flatten instances for `A` and `B`.
implicit def flattenPattern[A, B]
(implicit flattenA : Flatten[A], flattenB : Flatten[B]) =
new Flatten[A ~ B] {
def apply(m : A ~ B) = m match {
case a ~ b => flattenA(a) ::: flattenB(b)
}
}
// Flatten instance for ParseResult[T]. Requires a Flatten instance for T.
implicit def flattenParseResult[T]
(implicit flattenT : Flatten[T]) = new Flatten[ParseResult[T]] {
def apply(p : ParseResult[T]) = (p map flattenT) getOrElse Nil
}
Finalmente podemos definir una función de conveniencia para simplificar la aplicación de Flatten
casos para analizar los resultados,
def flatten[P](p : P)(implicit flatten : Flatten[P]) = flatten(p)
y ahora estamos listos para ir,
val testChar = "abc"
val output = parseAll(content, testChar)
println(output) // ((a~b)~c) but I want List(a, b, c)
val flattenedOutput = flatten(output)
println(flattenedOutput) // List(a, b, c)
no creo que eso sea posible. ¿No puedes dividir tus cadenas en pedazos más pequeños? ¿Qué estás tratando de hacer exactamente? Tal vez si le das un poco más de contexto alguien tiene una mejor solución para esto. – drexin