我正在阅读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 程序员所做的......
想法?
根据我对 Louis Wasserman 回答的评论如下:
我想在这里,与理解的命令式解释相对应的顺序被认为比与嵌套列表相对应更自然。因此,本质上,Haskell 对此的解释与我在问题中链接的 Python 解释相同,毕竟,看起来。