Я читаю Gentle Introduction и задаюсь вопросом, почему в понимании списка с двумя генераторами самый правый генератор повторяется "самый быстрый" (т.е. компилируется в самый внутренний цикл, я думаю). Обратите внимание на следующий выход GHCi:
*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)]
Если самый левый генератор был истребитель быстрее всего, два вышеуказанных выражения имели бы то же значение, которое, я думаю, делает выбор этого соглашения более естественным.
Так кто-нибудь знает, почему было выбрано противоположное соглашение? Я заметил, что у Python есть такое же соглашение, что и Haskell (возможно, даже заимствовано у Haskell?), А в мире Python слово кажется, что упорядочение был выбран "потому что тот порядок, в котором вы пишете цикл for", но я понимаю, что мышление с точки зрения циклов не совсем то, что делают большинство программистов Haskell...
Мысли?
Из моего комментария к Луи Вассерману ответ ниже:
Я предполагаю, что порядок, соответствующий экспликации понимания императивного стиля, считался более естественным, чем его соответствие с вложением списка. По сути, объяснение Хаскелла для этого такое же, как объяснение Python, которое я связал в вопросе, в конце концов, похоже.