任务是使用foldr
或foldl
只使用一个直通。
我用这个决定:
evenOnly = fst . foldr (\x (y1, y2) -> (y2, x:y1)) ([],[])
非常适合有限列表。如果我尝试evenOnly [1,2..]
,我会失败。我知道这是因为暂停的问题,但我怎么能分开列表或如何将有关列表位置或其他内容的其他信息传递给列表末尾的计算?
答案 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
("递归"结果)。