List 用fold拆分Haskell中的列表?

List 用fold拆分Haskell中的列表?,list,haskell,split,fold,List,Haskell,Split,Fold,需要使用foldl或foldr实现拆分 例如:将[2,4,6,8,7]拆分为([2,6,7],[4,8])这相对简单。我们知道折叠的“种子”类型,它必须是一对列表。我们通过简单地交换两个列表来替换要附加到的两个列表中的哪个列表,然后附加到左侧的列表(在每次迭代之间会发生变化) 如果我们使用foldl,列表会倒排出来,因此foldr似乎是合乎逻辑的选择。给定一个谓词p::a->Bool,您可以使用foldr对其进行拆分,如下所示: split :: (a -> Bool) -> [a]

需要使用
foldl
foldr
实现拆分


例如:将
[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])

投票时不清楚你在问什么,因为不清楚你在问什么。您至少应该包括对您遇到的问题的描述,以及到目前为止您试图解决的问题。这个问题与我想我们可以将其概括为类似
insertAndSwap x(xss,[])=insertAndSwap x([],反向xss)
insertAndSwap x(yss,(zs:zss))=((x:zs):yss,zss)
splitn | n>0=(\(x,y)->x++反向y)。foldr swap([],replicate n[])
是否只希望三元组具有相同的功能<代码>文件夹(\x(l1,l2,l3)->(x:l2,l3,l1))([],[],[])?我想我遗漏了什么。
foldr(\x(l1,l2,l3)->(x:l3,l1,l2))([],[],[])[1..10]
。所谓“遗漏了什么”,我的意思是我不知道你为什么问这个问题。
Prelude> split (\x -> x `mod` 4 /= 0) [2,4,6,8,7]
([2,6,7],[4,8])