自己的小块功能 - 如何使用foldl / foldr?

时间:2016-03-03 12:25:42

标签: list haskell fold

这是我自己的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,你能帮助我吗?我看不出办法。

2 个答案:

答案 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]})