过滤haskell中的列表理解

bas*_*354 2 haskell list-comprehension filter

我有这个列表理解:

[(x,y)| x<-[1..2], y<-[x..3], let z = x+y, odd z]
Run Code Online (Sandbox Code Playgroud)
  1. 正确的结果是[(1,2),(2,3)],但我不明白为什么.什么是过滤器"让z = x + y,奇数z"做什么?其他代码中没有"z",所以我无法理解为什么这会改变一些东西.
  2. 有人可以一步一步解释这里发生的事情.

非常感谢!

Mar*_*ark 5

您正在生成元组,其中元素的总和必须是奇数。该行:

let z = x+y, odd z
Run Code Online (Sandbox Code Playgroud)

z为 sum指定名称x + y,然后将该值与谓词一起使用odd来测试总和是否实际上是奇数。x和的组合y,其odd z计算结果为True进入结果列表,其他的被删除。

请注意,集合的最低值y是变量的实际值x

x <- [1..2]
y <- [x..3]
Run Code Online (Sandbox Code Playgroud)

这是为了从考虑中删除一些“重复项”( (2,1))。


Ree*_*Oei 5

所以x从1到2,y从x到3.

所以对于第一个:

x = 1
y = 1
z = 1 + 1 = 2
Run Code Online (Sandbox Code Playgroud)

z并不奇怪,因此,它不会被添加.然后:

x = 1
y = 2
z = 1 + 2 = 3
Run Code Online (Sandbox Code Playgroud)

z现在是奇数,所以它被添加了.然后:

x = 1
y = 3
z = 1 + 3 = 4
Run Code Online (Sandbox Code Playgroud)

z是偶数,不添加ergo.然后:

x = 2
y = 2
z = 2 + 2 = 4
Run Code Online (Sandbox Code Playgroud)

z是偶数.

然后:

x = 2
y = 3
z = 2 + 3 = 5
Run Code Online (Sandbox Code Playgroud)

z是5,奇数,因此添加.