Esta pregunta trata sobre la forma en que Scala realiza la coincidencia de patrones y la recursión con listas y el rendimiento de las mismas.Rendimiento de recursión en la lista de escalas
Si tengo una función que recursivamente a través de una lista y lo hago con juego en una contra, por ejemplo, algo como:
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => «something» myFunction(xs)
}
En Haskell:
myFunction [] = []
myFunction (x:xs) = «something» : myFunction xs
estoy usando la misma semántica que haría con, por ejemplo, Haskell. No creo que haya ninguna pregunta sobre la implementación de Haskell ya que es simplemente la forma en que manejas las listas. Para una larga lista (estaría operando en una lista con algunos miles de nodos), Haskell no parpadearía (me imagino, sin embargo, nunca lo intenté).
Pero por lo que sé con Scala, la declaración partido llamaría el método de extracción cancelar la aplicación de dividir la lista en torno a los contras y, para extender el ejemplo de una función que no hace nada a la lista:
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => x :: myFunction(xs)
}
En Haskell:
myFunction [] = []
myFunction (x:xs) = x : myFunction xs
sería llamar a aplicar el método de extracción de los contras de nuevo juntos. Para una larga lista, me imagino que esto sería muy caro.
Para ilustrar, en mi caso específico, quiero recurrir sobre una lista de caracteres y acumular varias cosas, donde la cadena de entrada es algo hasta algunas decenas de kilobytes.
¿Debo llamar realmente a los constructores y extractores para cada paso de la recursión si quiero recurse en una larga lista? ¿O hay optimizaciones? O mejores formas de hacerlo? En este caso necesitaría varias variables del acumulador y, obviamente, no sería sólo de manera recursiva a través de una lista de no hacer nada ...
(Por favor, disculpe mi Haskell, yo no he escrito una línea de dos años.)
(Y sí, voy por la recursión de cola.)
¡Gracias! Sí, lo que estoy escribiendo será recursivo, ¡el segundo fragmento fue un mal ejemplo! Lo que realmente pretendo hacer es dividir la cadena de entrada en varios fragmentos en función de alguna función no trivial: el resultado son los acumuladores, no cualquier salida de estilo de mapa o doblez. Tal vez estaba tratando de hacer la pregunta demasiado general en la búsqueda de un patrón general que pueda usar en este caso específico. – Joe
Bueno, eche un vistazo al último ejemplo que agregué. –
Perfecto, eso responde a ambas facetas. ¡Muchas gracias! – Joe