这是我自己的nub实现(删除重复项):
nub :: (Eq a) => [a] -> [a]
nub lista = nub_rec lista []
where
nub_rec :: (Eq a) => [a] -> [a] -> [a]
nub_rec [] acc = acc
nub_rec (x:xs) acc = nub_rec (filter (\y -> if y == x then False else True) xs) (x:acc)
我考虑如何使用foldr / foldl来实现nub,你能帮助我吗?我看不出办法。
答案 0 :(得分:3)
首先,nub
的实现比它需要的更复杂(并且它颠倒了列表中元素的顺序)。这是一个更简单的一个:
myNub :: Eq a => [a] -> [a]
myNub (x:xs) = x : filter (/= x) (myNub xs)
myNub [] = []
现在,如果我们想使用foldr
来编写一个将输出的函数,而不仅仅是“聚合”而是一个完整的列表,首先看看最简单的foldr
是有用的 - 基于函数,它接收一个列表并吐出一个列表:
myNoop :: [a] -> [a]
myNoop l = foldr (\ x xs -> x : xs) [] l
鉴于此,必须在某处插入filter
。因为我认为这是一个家庭作业,我会把它作为练习留给OP:)
答案 1 :(得分:1)
仅使用过滤器和文件夹的解决方案,而无需直接(或自身)递归:
expected_output = pd.DataFrame({'Year': ['2012', '2013', '2014', '2015', '2012', '2013', '2014', '2015', '2012', '2013', '2014', '2015'],
'Area': ['Chicago, IL metro area', 'Chicago, IL metro area', 'Chicago, IL metro area', 'Chicago, IL metro area', 'Chicago, IL', 'Chicago, IL', 'Chicago, IL', 'Chicago, IL', 'Chicago, IL - Albany Park', 'Chicago, IL - Albany Park', 'Chicago, IL - Albany Park', 'Chicago, IL - Albany Park'],'yearly_price_change': ['5%', '10%', '7%','21%', '15%', '12%', '2%','21%', '10%', '11%', '12%','6%'],
'price_label':[0, 1, 0,1,1,1,0,1,1,1,1,0]})