我写了一个函数来分隔隔行扫描元素。
interlacedElems :: [a] -> ([a], [a])
interlacedElems xs = (f xs, f $ tail xs)
where f (x:_:xs) = x : f xs
f x = x
main = print $ interlacedElems "a1b2c3d4"
产生的结果:
("abcd","1234")
在我的代码中,我定义f
并使用它两次,有效地在同一列表中递归两次,但每次都略有不同。
我的问题是:有没有办法可以写这个,所以我只能通过列表递归一次?因为那会更有效率,你不觉得恍惚吗?
我试图弄清楚我的一些大脑泄漏了然后我的妈妈告诉了我,因为她说我总是在整个地方都喝脑汁,需要很长时间才能把粉红色的污渍从地毯里拿出来
谢谢你们好人:)
答案 0 :(得分:9)
你也可以使用foldr
使用这个技巧来做到这一点:
interlacedElems :: [a] -> ([a], [a])
interlacedElems = foldr (\x ~(l,r) -> (x:r,l)) ([],[])
注意强>
无可辩驳的模式~(l,r)
使其可以在无限列表上工作。
答案 1 :(得分:2)
我只想编写一个函数,以递归方式将列表拆分为元组,然后使用unzip
:
listToTuples :: [a] -> [(a, a)]
listToTuples (x:y:xs) = (x, y) : listToTuples xs
listToTuples _ = []
interlacedElems :: [a] -> ([a], [a])
interlacedElems = unzip . listToTuples