Почему генераторы списков Haskell с несколькими генераторами рассматривают крайний правый генератор как самый тесный цикл?

I Я читаю 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», но я понимаю, что это мышление с точки зрения циклов for это не совсем то, что делает большинство программистов на Haskell...

Мысли?


Из моего комментария к ответу Луи Вассермана ниже:

я предполагаю, что здесь порядок, соответствующий императивному -стилю объяснения понимания, считался более естественным, чем его соответствие вложению списка. Так что, по сути, объяснение Haskell для этого такое же, как объяснение Python, которое я связал в вопросе, в конце концов, кажется.

15
задан kini 1 May 2012 в 15:37
поделиться