过滤haskell中的列表理解

时间:2014-09-18 13:12:16

标签: haskell filter list-comprehension

我有这个列表理解:

[(x,y)| x<-[1..2], y<-[x..3], let z = x+y, odd z]
  1. 正确的结果是[(1,2),(2,3)],但我不明白为什么。什么是过滤器“let z = x + y,odd z” 在做什么?其他代码中没有“z”,所以我无法理解为什么这会改变一些东西。
  2. 有人可以一步一步地解释这里发生的事情。
  3. 非常感谢!

2 个答案:

答案 0 :(得分:5)

因此x从1变为2,y从x变为3。

所以对于第一个:

x = 1
y = 1
z = 1 + 1 = 2

z并不奇怪,因此,它没有添加。 然后:

x = 1
y = 2
z = 1 + 2 = 3

z现在很奇怪,所以它被添加了。 然后:

x = 1
y = 3
z = 1 + 3 = 4

z是偶数,而且没有添加。 然后:

x = 2
y = 2
z = 2 + 2 = 4

z是偶数。

然后:

x = 2
y = 3
z = 2 + 3 = 5

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

答案 1 :(得分:2)

你正在生成元组,其元素之和必须是奇数。这一行:

let z = x+y, odd z

将名称z提供给总和x + y,然后将此值与谓词odd一起使用,以测试总和是否实际为奇数。 xy的组合(odd z评估为True进入结果列表,其他组合将被删除。

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

x <- [1..2]
y <- [x..3]

这是为了删除一些“重复”((2,1))。