существует ли реализация прелюдии union и intersect Haskell?

есть ли в стандартных функциях прелюдии, которые реализуют объединение и пересечение множеств ?

union      :: (Eq a) => [a] -> [a] -> [a]
intersect  :: (Eq a) => [a] -> [a] -> [a]

Если нет, может кто-нибудь может сказать, если моя реализация эффективна, (хорошо используйте функцию лени и прелюдии)

unionSet :: (Eq a) => [a] -> [a] -> [a]
unionSet as bs = foldl (xs y -> if elem y xs then xs else xs ++ [y]) as bs

intersectSet :: (Eq a) => [a] -> [a] -> [a]
intersectSet as bs = let ns = [ a | a <- as, elem a bs] in [ b | b <- bs, elem b ns]

3 ответов


здесь union и intersect функции в списках стандартных библиотек, расположенных в Data.List а не в .

что касается эффективности, я собираюсь сказать " НЕТ " всем вышеперечисленным, как вашим, так и стандартной библиотеке. На самом деле нет никакого способа когда-либо быть эффективными операциями в списке только с Eq ограничения. Тем не менее, вы все равно можете найти реализацию в Data.List информативный--см. ссылки выше, на что я указал непосредственно на соответствующий источник.

редактировать -- в качестве краткого добавления для потомства, не забудьте увидеть ответ Дона за то, что вы на самом деле хочу использовать для этой цели, а не более узкий вопрос "существуют ли эти функции вообще".


базовая библиотека предоставляет версии списка, как указывает camccann. Если вы хотите что-то более эффективное, рассмотрите данные.Set, который обеспечивает:

union :: Ord a => Set a -> Set a -> Set a

intersection :: Ord a => Set a -> Set a -> Set a

со сложностью O (n+m).


вы часто найдете реализации того, что вам нужно, ища подписи. Просто поместите свою подпись типа в Hoogle ( haskell.org/hoogle/... ).