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

Jan*_*Doe -1 haskell

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

[(x,y) | x <- [0..2], y<-[0,x])
Run Code Online (Sandbox Code Playgroud)

和输出

  [(0,0),(0,0),(1,0), (1,1), (2,0), (2,2)]
Run Code Online (Sandbox Code Playgroud)

(2,0)混淆了我,如果y映射到0到x而x等于1 =(1,1)则不会

[(0,0),(0,0),(1,0), (1,1), **(2,1)**, (2,2)]
Run Code Online (Sandbox Code Playgroud)

或者是因为由于y使用其列表[0,1]中的所有数字,它还原为0?

Car*_*ten 7

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

[0,x] 是:

  • [0,0] 对于 x=0
  • [0,1] 对于 x=1
  • [0,2] 对于 x=2

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

   [(0,0),(0,0)] -- x = 0
++ [(1,0),(1,1)] -- x = 1
++ [(2,0),(2,2)] -- x = 2
Run Code Online (Sandbox Code Playgroud)

这会产生你给定的输出


注意:[0,2]长度为2,与[0..2]长度为3且包含的长度完全不同1


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

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

  • [0] 对于 x=0
  • [0,1] 对于 x=1
  • [0,1,2] 对于 x=2

如果你把每一个yx你对应的相应配对

   [(0,0))]            -- x = 0
++ [(1,0),(1,1)]       -- x = 1
++ [(2,0),(2,1),(2,2)] -- x = 2
Run Code Online (Sandbox Code Playgroud)

然后会给你结果

[(0,0),(1,0),(1,1),(2,0),(2,1),(2,2)]
Run Code Online (Sandbox Code Playgroud)