Quiero agregar 3 listas o más a la vez en una sola expresión.uso múltiple de ++: ¿más eficiente si forzo la evaluación de derecha a izquierda?
a ++ b ++ c
¿El operador ++ se evaluará de izquierda a derecha o de derecha a izquierda?
1. (a ++ b) ++ c
2. a ++ (b ++ c)
yo diría que la opción 2, porque si ++ era una función de prefijo, escribiríamos ++ a ++ b c
que conduce naturalmente a la evaluación de ++ b c
primero. No estoy seguro si estoy en lo correcto.
Pero si se trata de la opción 1, me parece que explícitamente cambiar el orden de evaluación de derecha a izquierda es más eficiente:
a ++ (b ++ c)
He aquí por qué: a ++ b ++ c
primero evaluar a ab ++ c
en n pasos (donde n es la longitud de a y ab es, por supuesto, la concatenación de ayb) y luego a abc
en n + m más pasos (m es la longitud de b, así n + m es la longitud de ab), que hace un total de 2n + m pasos. Mientras que a ++ (b ++ c)
primero evaluará a a ++ bc
en m pasos, y luego a abc
en n pasos más, que es un total de n + m solamente.
Soy nuevo en haskell y no estoy seguro de lo que estoy diciendo, me gustaría obtener alguna confirmación.
y significa que infixr que sin paréntesis, es la opción 2. –
supongo que debería haber hecho hincapié en que explícitamente! –
Sí, la asociatividad de ++ se seleccionó exactamente para hacerlo más eficiente. – augustss