Estoy leyendo a través del Gentle Introduction y me pregunto por qué en una lista de comprensión con dos generadores, el generador de la derecha se repite "el más rápido" (es decir, se compila en el ciclo más interno, supongo). Observe la siguiente salida GHCi:¿Por qué Haskell enumera las comprensiones con múltiples generadores que tratan el generador más a la derecha como el lazo más cerrado?
*Main> concat [[(x,y) | x <- [0..2]] | y <- [0..2]]
[(0,0),(1,0),(2,0),(0,1),(1,1),(2,1),(0,2),(1,2),(2,2)]
*Main> [(x,y) | x <- [0..2], y <- [0..2]]
[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
Si el generador de más a la izquierda se itera más rápido, las dos expresiones anteriores tendrían el mismo valor, que creo que hace que la elección de esta convención más natural de alguna manera.
¿Alguien sabe por qué se eligió la convención opuesta? Me doy cuenta de que Python tiene la misma convención que Haskell (¿tal vez incluso la tomó prestada de Haskell?), Y en el mundo de Python the word parece ser que el orden fue elegido "porque ese es el orden en el que escribirías un bucle for", pero reunir que pensar en términos de bucles for no es exactamente lo que hacen la mayoría de los programadores Haskell ...
¿Pensamientos?
Desde mi comentario sobre la respuesta de Louis Wasserman a continuación:
supongo que aquí el orden que corresponde a una explicación de estilo imperativo de la comprensión se consideró más natural de tener que corresponde con la anidación de la lista. Entonces, en esencia, la explicación de Haskell para esto es la misma que la explicación de Python que relacioné en la pregunta, después de todo, parece.
¿Cómo sería esto * más natural *? ¿También quiere 11, 21, 31, 41 en lugar de 11, 12, 13, 14? – Ingo
Supongo que usar '(y, x)' como expresión prototípica - o poner el generador y a la izquierda del generador x - tendría más sentido si el generador de la izquierda fuera el más ajustado. Entonces sería la segunda línea en mi salida de GHCi lo que te pareció extraño (11, 21, 31, 41), en lugar del primero, pero igual serían diferentes el uno del otro, que es mi punto. – kini
Lo siento, creo que debería dirigirme a usted cuando le contesto, @Ingo. (Algo nuevo en Stack Overflow.) – kini