在折叠中分割Haskell中的列表?

时间:2018-05-01 12:36:39

标签: list haskell split fold

需要使用foldlfoldr实现拆分。

例如:将[2, 4, 6, 8, 7]拆分为([2, 6, 7], [4, 8])

2 个答案:

答案 0 :(得分:1)

这是相对简单的。我们知道折叠的“种子”的类型,它必须是一对列表。我们通过简单地交换两个列表来替换我们要附加的两个列表中的哪个列表,并且我们在左侧附加列表(这将在每次迭代之间改变)。

foldr (\x (ys,zs) -> (x:zs, ys)) ([],[]) [2,4,6,8,7]  -- ([2,6,7],[4,8])

如果我们使用foldl,则列表会向后显示,因此foldr似乎是合乎逻辑的选择。

答案 1 :(得分:0)

给定谓词p :: a -> Bool,您可以使用foldr对其进行拆分,如下所示:

split :: (a -> Bool) -> [a] -> ([a],[a])
split p = foldr (\x (as, bs) -> if p x then (x:as, bs) else (as, x:bs)) ([],[])

例如:

Prelude> split (\x -> x `mod` 4 /= 0) [2,4,6,8,7]
([2,6,7],[4,8])