Sto leggendo il Gentle Introduction e mi sto chiedendo perché in una lista di comprensione con due generatori, il generatore più a destra è iterato "il più veloce" (cioè compila il ciclo più interno, immagino). Osservare il seguente output GHCi:Perché la comprensione delle liste Haskell con più generatori considera il generatore più a destra come il ciclo più stretto?
*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)]
Se il generatore più a sinistra sono stati iterata più veloce, queste due espressioni avrebbero lo stesso valore, che a mio avviso rende la scelta di questa convenzione più naturale in qualche modo.
Così qualcuno sa perché è stata scelta la convenzione opposta? Ho notato che Python ha la stessa convenzione di Haskell (forse l'ha anche preso in prestito da Haskell?), E nel mondo Python the word sembra che l'ordine sia stato scelto "perché è l'ordine in cui si scrive un ciclo for", ma io Raccogliere che pensare in termini di cicli for non è esattamente ciò che la maggior parte dei programmatori Haskell fa ...
Pensieri?
Dal mio commento sulla risposta di Louis Wasserman di seguito:
immagino qui l'ordine corrispondente ad una spiegazione imperativo stile della comprensione è stato considerato più naturale di averlo corrisponde nidificazione lista. Quindi in sostanza la spiegazione di Haskell per questo è la stessa della spiegazione Python che ho inserito nella domanda, dopotutto, sembra.
Come sarebbe * più naturale *? Vuoi anche 11, 21, 31, 41 invece di 11, 12, 13, 14? – Ingo
Immagino che usare '(y, x)' come espressione prototipica - o mettere il generatore y alla sinistra del generatore x - avrebbe più senso se il generatore più a sinistra fosse il loop più stretto. Quindi sarebbe la seconda riga della mia uscita GHCi che ti sembrò strana (11, 21, 31, 41), piuttosto che la prima, ma sarebbero comunque diversi l'una dall'altra, il che è il mio punto. – kini
Scusa, suppongo che dovrei rivolgermi a te quando rispondo a te, @Ingo. (Tipo di nuovo per l'overflow dello stack.) – kini