2016-03-03 5 views
0

Вот моя реализация NuB (удаление дубликатов):собственная функция нуба - как использовать foldl/foldr?

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 для реализации бугорка, могли бы вы мне помочь? Я не вижу пути.

+1

Кстати, '\ y -> if y == x, тогда False else True' то же самое, что и' not. (== x) 'или просто'/= x' – obadz

ответ

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 как упражнение :)

+0

Даже проще, '(\ x xs -> x: xs)' эквивалентно '(:)'. – chepner

+1

Да и 'foldr (:) []' также может быть 'id' ;-) Я немного расширил, чтобы облегчить добавление' filter' ;-) – obadz

+0

Спасибо за вашу помощь. Тем не менее, ваше решение без фолда проще, чем мой, но мой хвост-рекурсия - ваш не хвост-recursiob. –

 Смежные вопросы

  • Нет связанных вопросов^_^