2016-11-04 2 views
-3

Я пытаюсь сделать функцию, которая, учитывая два списка, удаляет из обоих списков элементы, которые они имеют в commen. Я ломаю голову над этим, но я не смог придумать достойное решение.Удалить элементы из двух списков

Например, если:

` let a = [1,2,3,4,5] ` 
` let b = [1,3,5,7,9] ` 
` f a b ` 

Тогда е должен возвращать что-то вроде:

` ([2,4], [7,9]) ` 
+1

Вы пытались сломать проблему на мелкие кусочки? Где именно у вас проблемы? Я предполагаю, что это домашнее задание, но в реальной жизни, если вы столкнулись с этой проблемой, сначала рассмотрите, подходит ли 'Set' или какая-либо другая структура данных. – jberryman

+0

Это фактически уже разбито на то, что я действительно хочу. Я нахожу это трудным, как вам нужно перебирать один список по другому, а затем возвращать список [Integer]. Я часто получаю список [[Целочисленный]], в котором я удалял только один элемент в списке. Не использовались никакие другие структуры данных в Haskell, кроме списков и тележек, я буду лучше смотреть и видеть любую работу, спасибо за подсказку. – Henk

+0

Вот пример того, что я имею в виду, чтобы разбить проблему на более мелкие части для вашего примера: вы можете определить следующие функции: 'unionLists :: [Int] -> [Int] -> [Int]' (это возвращает элементы в общий между двумя списками), 'delete :: Int -> [Int] -> [Int]' (который возвращает список с элементом, который вы передали при удалении первого параметра). Тогда, если у вас возникли проблемы с определением 'unionLists' за один раз, вы можете сломать это далее в' elem :: Int -> [Int] -> Bool' и 'filter', или, возможно,' merge' и 'sort', если вы «Я чувствую себя умным. – jberryman

ответ

1

Вы можете фильтровать списки с предикатом not.flip (elem):

f :: Eq a => [a] -> [a] -> ([a],[a]) 
f a b = (filter (not.flip (elem) b) a,filter (not.flip(elem) a) b) 

Если мы импорт Data.Foldable, мы можем использовать nonElem для упрощения этого ab далее:

f a b = (filter (`notElem` b) a,filter (`notElem` a) b) 
+1

'Data.Foldable.notElem' и разделы делают это немного чище:' '(' notElem' b) '' vs. 'not. flip elem b'. –

+1

Что именно делает флип? Согласно hoogle, его тип - '(a → b → c) → (b → a → c)' will '(not.flip (elem) b)' тогда не будет таким же, как '(not. B (elem)) '? – Henk

+2

@Henk Нет, 'flip' переворачивает аргументы функции. Так, например, 'flip elem x y' совпадает с' elem y x'. –

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