使用单个循环分隔交错元素

时间:2013-10-26 21:19:08

标签: haskell

我写了一个函数来分隔隔行扫描元素。

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并使用它两次,有效地在同一列表中递归两次,但每次都略有不同。

我的问题是:有没有办法可以写这个,所以我只能通过列表递归一次?因为那会更有效率,你不觉得恍惚吗?

我试图弄清楚我的一些大脑泄漏了然后我的妈妈告诉了我,因为她说我总是在整个地方都喝脑汁,需要很长时间才能把粉红色的污渍从地毯里拿出来

谢谢你们好人:)

2 个答案:

答案 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