需要使用foldl
或foldr
实现拆分。
例如:将[2, 4, 6, 8, 7]
拆分为([2, 6, 7], [4, 8])
。
答案 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])