用折叠拆分哈斯克尔中的列表?



需要实现与foldlfoldr的拆分。

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

这是相对简单的。我们知道折叠的"种子"的类型,它必须是一对列表。我们通过简单地交换两个列表来替换要附加到的两个列表的列表,然后附加到左侧的列表(每次迭代之间都会发生变化(。

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

如果我们使用foldl列表会倒退,所以foldr似乎是合乎逻辑的选择。

给定一个谓词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])

最新更新