2015-03-27 3 views
5

Мне нужно создать функцию poweret в haskell, которая принимает набор и выводит мощность без дубликатов записей, независимо от того, что помещено в список ввода. Например: [1,1] следует вернуть [[], [1]]Powerset Without Duplicates

powerset [] = [[]] 
    powerset (x:xs) = union((powerset xs)) (map (x:) (powerset xs)) 

где объединение ранее определенная функция примыкает два набора без дубликатов. Проблема с вышеуказанным кодом заключается в том, что он считает дубликаты исходными, поэтому ввод [1,1] возвращает [[], [1], [1], [1,1]].

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

+1

Не совсем эффективный: 'filterM (const [True, False]) $ nub xs' – Sibi

ответ

5
  1. Удалить все дубликаты из данного списка (вы можете использовать функцию nub).

  2. Запустить алгоритм, который вы используете сейчас.

+0

Как это сделать все в одной и той же функции? Я хочу запустить poweret как функцию, которая сначала удаляет обманы, а затем возвращает poweret. – lepdeffard

+1

@lepdeffard Это жесткое требование использовать одну функцию? Если это не так, вы можете переименовать свою текущую функцию в 'powerset'' и определить' powerset' как состав 'powerset'' и' nub'. – kraskevich

+0

Я думаю, что это должно сработать. Спасибо :) – lepdeffard