Объединение и пересечение двух списков без явной рекурсии - PullRequest
0 голосов
/ 03 марта 2019

У меня есть две функции, которые должны работать с двумя списками.

unionB :: Eq a => [a] -> [a] -> [a] 

intersectB :: Eq a =>  [a] -> [a] -> [a]

Для unionB У меня есть следующий код, который принимает объединение двух списков, которое делает это без использования явной рекурсии.

 unionB :: Eq a => [a] -> [a] -> [a]
 unionB xs ys = [xs] ++ [[y] | y <- ys]

Для intersectB У меня есть следующий код, который будет принимать пересечение двух списков (взять минимальное количество отсчетов).Единственная проблема заключается в том, что я делаю это с явной рекурсией.Код ниже:

intersectB :: Eq a => [a] -> [a] -> [a]
intersectB (x:xs) list
     | x `elem` list = x : intersectB xs list
     | otherwise = intersectB xs list

Есть ли способ использовать структуру моей intersectB функции, кроме как без использования явной рекурсии?(т.е. не упоминая intersectB в своем теле?)

Насколько я понимаю, intersectB должен быть противоположностью тому, что делает unionB.Я предполагаю, что intersectB будет выглядеть очень похоже на то, как выглядит unionB.

Я не могу использовать любой импорт.Я понимаю, что есть импорт, который уже делает это.

Спасибо.

1 Ответ

0 голосов
/ 03 марта 2019

Ваша первая функция должна быть

 unionB :: Eq a => [a] -> [a] -> [a]                                     
 unionB xs ys = xs ++ [y | y <- ys, not (elem y xs)]

А вторая, аналогичной формы,

 intersectB :: Eq a => [a] -> [a] -> [a]                                     
 intersectB xs ys = [y | y <- ys, elem y xs]

Это предполагает, что Bag a совпадает с [a].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...