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

5 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"
Run Code Online (Sandbox Code Playgroud)

产出量:

("abcd","1234")
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我定义f并使用它两次,有效地通过相同的列表两次递归,但每次都略有不同.

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

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

谢谢你们好人:)

is7*_*s7s 9

你也可以foldr使用这个技巧来做到这一点:

interlacedElems :: [a] -> ([a], [a])
interlacedElems = foldr (\x ~(l,r) -> (x:r,l)) ([],[])
Run Code Online (Sandbox Code Playgroud)

注意

无可辩驳的模式~(l,r)使其适用于无限列表.


bhe*_*ilr 2

我只需编写一个函数,将列表递归地拆分为元组,然后使用unzip

listToTuples :: [a] -> [(a, a)]
listToTuples (x:y:xs) = (x, y) : listToTuples xs
listToTuples _ = []

interlacedElems :: [a] -> ([a], [a])
interlacedElems = unzip . listToTuples
Run Code Online (Sandbox Code Playgroud)