我是哈斯克尔的新人,我做了一个练习。理论上我知道我应该怎么做,但我不知道我怎么能在Haskell做到这一点。我的练习是创建一个列表生成器,它生成以下无限列表:[1,-1,3,-3,5,-5..]
。我想用两个不同的顺序来做。
有没有办法解决这个问题:
[ something [a,b,a,b..] | a<-[1,3..], b<-[-1,-3..] ]
我已经尝试过搜索解决方案,但我找不到任何关于列表生成器的信息。
答案 0 :(得分:4)
我会给你一个提示。
表格的列表生成器:
[f x y | x <- xs, y <- ys]
将执行列表xs
和ys
的笛卡尔产品(好吧,它会将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 y0
,f x y1
,...,f x yN
值。
问问自己:
ys
无限时会发生什么? 1
和-1
,然后3
和-3
的技术,它不需要两个无限列表但只有一个无限列表列表?现在努力自己回答这些问题,因为如果不是为了实际锻炼你的思想,那么做练习是没有意义的。我将在剧透报价中提供答案,这样如果您放弃,您可以一个可能的解决方案:
[x*y | x <- [1, 3..], y <- [1,-1]]