自己的 nub 功能 - 如何使用 foldl/foldr?
own nub function - how to use foldl/foldr?
这是我自己实现的 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,你能帮我吗?我看不到路。
首先,您对 nub
的实现比它需要的要复杂一些(并且它颠倒了列表中元素的顺序)。这是一个更简单的:
myNub :: Eq a => [a] -> [a]
myNub (x:xs) = x : filter (/= x) (myNub xs)
myNub [] = []
现在,如果我们想使用 foldr
编写一个函数来输出,不仅是 "aggregate" 而是完整列表,首先看一下最简单的 [=基于 13=] 的函数,接受一个列表并吐出一个列表:
myNoop :: [a] -> [a]
myNoop l = foldr (\ x xs -> x : xs) [] l
鉴于此,filter
必须插入某处。因为我认为这是一个家庭作业,我会把它留给 OP 作为练习:)
仅使用 filter 和 foldr 而不直接(或自)递归的解决方案:
removeDuplicates :: Eq a => [a] -> [a]
removeDuplicates = foldr (\z ys -> z : filter (/= z) ys) []
这是我自己实现的 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,你能帮我吗?我看不到路。
首先,您对 nub
的实现比它需要的要复杂一些(并且它颠倒了列表中元素的顺序)。这是一个更简单的:
myNub :: Eq a => [a] -> [a]
myNub (x:xs) = x : filter (/= x) (myNub xs)
myNub [] = []
现在,如果我们想使用 foldr
编写一个函数来输出,不仅是 "aggregate" 而是完整列表,首先看一下最简单的 [=基于 13=] 的函数,接受一个列表并吐出一个列表:
myNoop :: [a] -> [a]
myNoop l = foldr (\ x xs -> x : xs) [] l
鉴于此,filter
必须插入某处。因为我认为这是一个家庭作业,我会把它留给 OP 作为练习:)
仅使用 filter 和 foldr 而不直接(或自)递归的解决方案:
removeDuplicates :: Eq a => [a] -> [a]
removeDuplicates = foldr (\z ys -> z : filter (/= z) ys) []