列表理解输出不是我假设的

时间:2016-01-14 17:11:55

标签: haskell

我认为它在我大学过去的论文中很简单,但功能是:

[(x,y) | x <- [0..2], y<-[0,x])

和输出

  [(0,0),(0,0),(1,0), (1,1), (2,0), (2,2)]

(2,0)让我感到困惑,如果y映射到0到x而x等于1 =(1,1)则不会

[(0,0),(0,0),(1,0), (1,1), **(2,1)**, (2,2)]

还是因为y在列表[0,1]中使用了所有数字,它会恢复为0?

1 个答案:

答案 0 :(得分:7)

案例[(x,y) | x <- [0..2], y<-[0,x]]

[0,x]是:

    {li> [0,0] x=0 {li> [0,1] x=1 {li> [0,2] x=2

所以,如果你将每个y与相应的x配对,你会得到:

   [(0,0),(0,0)] -- x = 0
++ [(1,0),(1,1)] -- x = 1
++ [(2,0),(2,2)] -- x = 2

产生您的给定输出

注意:[0,2]长度为2,与长度为3且包含[0..2]

1完全不同

案例[(x,y) | x <- [0..2], y<-[0..x]]

它并没有那么不同 - [0..x]是:

    {li> [0] x=0 {li> [0,1] x=1 {li> [0,1,2] x=2

如果您将每个y与相应的x配对,那么

   [(0,0))]            -- x = 0
++ [(1,0),(1,1)]       -- x = 1
++ [(2,0),(2,1),(2,2)] -- x = 2

然后会给你结果

[(0,0),(1,0),(1,1),(2,0),(2,1),(2,2)]