获取位于初始列表的偶数位置的元素列表

时间:2016-03-17 11:07:53

标签: list haskell fold

任务是使用foldrfoldl只使用一个直通。 我用这个决定:

evenOnly = fst . foldr (\x (y1, y2) -> (y2, x:y1)) ([],[])

非常适合有限列表。如果我尝试evenOnly [1,2..],我会失败。我知道这是因为暂停的问题,但我怎么能分开列表或如何将有关列表位置或其他内容的其他信息传递给列表末尾的计算?

1 个答案:

答案 0 :(得分:2)

您可以使用lazy pattern ~(x1, y2)

> let evenOnly = fst . foldr (\x ~(y1, y2) -> (y2, x:y1)) ([],[])
> take 20 $ evenOnly [1..]
[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40]

这与

基本相同
> let evenOnly = fst . foldr (\x y -> (snd y, x:fst y)) ([],[])

的优点是过早地强制对构造函数。也就是说,上面的lambda将在其输出之前生成(,)构造函数它需要y("递归"结果)。