【问题标题】:Filter at the list comprehension in haskell在haskell中的列表理解中过滤
【发布时间】:2014-09-19 01:12:08
【问题描述】:

我有这个列表理解:

[(x,y)| x<-[1..2], y<-[x..3], let z = x+y, odd z]
  1. 正确的结果是 [(1,2),(2,3)],但我不明白为什么。什么是过滤器“让 z = x+y,奇数 z” 正在做?其他代码中没有“z”,所以我不明白为什么这会改变一些东西。
  2. 谁能一步一步解释这里发生了什么。

非常感谢!

【问题讨论】:

  • 如果有帮助的话[(x,y)| x&lt;-[1..2], y&lt;-[x..3], odd (x+y)].
  • for x in [1,2]: for y in range(x,4): z=x+y; if(odd(z)): yield (x,y).

标签: haskell filter list-comprehension


【解决方案1】:

所以 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,奇数,因此相加。

【讨论】:

    【解决方案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)) 的考虑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      相关资源
      最近更新 更多