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, которое я связал в вопросе, в конце концов, кажется.