如何在Haskell中将两个序列与列表生成器放在一起

时间:2016-03-05 19:25:08

标签: list haskell

我是哈斯克尔的新人,我做了一个练习。理论上我知道我应该怎么做,但我不知道我怎么能在Haskell做到这一点。我的练习是创建一个列表生成器,它生成以下无限列表:[1,-1,3,-3,5,-5..]。我想用两个不同的顺序来做。

有没有办法解决这个问题:

[ something [a,b,a,b..] | a<-[1,3..], b<-[-1,-3..] ]

我已经尝试过搜索解决方案,但我找不到任何关于列表生成器的信息。

1 个答案:

答案 0 :(得分:4)

我会给你一个提示。

表格的列表生成器:

[f x y | x <- xs, y <- ys]

将执行列表xsys笛卡尔产品(好吧,它会将f应用于产品的每个元素)。假设xs = [1,2,3]ys = ['a', 'b']以上列表理解等同于:

[f 1 'a', f 1 'b', f 2 'a', f 2 'b', f 3 'a', f 3 'b']

因此对于x的每个元素xs整个 ys会被迭代,从而产生所有f x y0f x y1 ,...,f x yN值。

问问自己:

  • ys无限时会发生什么?
  • 因此,无论如何,你的方法是否可行?
  • 您能想到另一种生成1-1,然后3-3的技术,它不需要两个无限列表但只有一个无限列表列表?

现在努力自己回答这些问题,因为如果不是为了实际锻炼你的思想,那么做练习是没有意义的。我将在剧透报价中提供答案,这样如果您放弃,您可以一个可能的解决方案:

  

[x*y | x <- [1, 3..], y <- [1,-1]]