2015-03-27 10 views
5

Ho bisogno di creare una funzione powerset in haskell che accetta un set e emette il power set senza voci duplicate, indipendentemente da ciò che viene inserito nella lista di input. Ad esempio [1,1] deve restituire [[], [1]]Powerset Without Duplicates

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

Dove unione è una funzione precedentemente definita confina con due set senza duplicati. Il problema con il codice precedente è che conta i duplicati come voci originali così input [1,1] restituisce [[], [1], [1], [1,1]].

Qualche idea? Ho pensato di usare l'unione con la lista di input e la lista vuota per eliminare i duplicati, prima di attivare il powerset, ma non sono sicuro di come sarebbe.

+1

Non esattamente efficiente: 'filterM (const [True, False]) $ nub xs' – Sibi

risposta

5
  1. Rimuovere tutti i duplicati dall'elenco fornito (è possibile utilizzare la funzione nub).

  2. Eseguire l'algoritmo che si sta utilizzando ora.

+0

Come faccio tutto questo nella stessa funzione? Voglio eseguire powerset come una funzione che rimuove prima i duplicati e quindi restituisce il powerset. – lepdeffard

+1

@lepdeffard È un requisito rigido utilizzare una funzione? Se non lo è, puoi rinominare la tua funzione corrente in 'powerset'' e definire' powerset' come una composizione di 'powerset'' e' nub'. – kraskevich

+0

Penso che questo dovrebbe funzionare. Grazie :) – lepdeffard

Problemi correlati