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

Get the list of elements located in the even positions of initial list

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

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

非常适合有限列表。如果我尝试 evenOnly [1,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 ("recursive" 结果)。