2015-03-27 17 views
5

Haskell'de bir set almak ve giriş listesine neyin girildiğine bakılmaksızın, güç girişlerini çift giriş olmaksızın çıkartan bir powerset işlevi oluşturmam gerekiyor. Örneğin, [1,1] [[[] 1]] döndürmelidirKopya Olmadan Powerset

powerset [] = [[]] 
    powerset (x:xs) = union((powerset xs)) (map (x:) (powerset xs)) 
birlik daha önce tanımlandığı işlev yinelenmemiş iki takım bitişik olan

. Yukarıdaki kodla ilgili sorun, kopyaları orijinal girdiler olarak saymasıdır, böylece [1,1] girişi [[], [1], [1], [1.1]] döndürür.

Herhangi bir fikrin var mı? Giriş listesini ve kopyaları tetiklemeden önce kopyaları çoğaltmak için boş listeyi kullanmayı düşündüm, ancak bunun nasıl görüneceğinden emin değilim.

+1

Tam olarak etkili değil: 'filterM (const [Doğru, Yanlış]) $ nub xs' – Sibi

cevap

5
  1. Kaldır verilen listeden tüm çiftleri (Eğer nub işlevini kullanabilirsiniz).

  2. Şimdi kullanmakta olduğunuz algoritmayı çalıştırın.

+0

Bunu aynı işlevde nasıl yapabilirim? Powerset'i önce dupes'leri kaldıran ve sonra powerset'i döndüren bir işlev olarak çalıştırmak istiyorum. – lepdeffard

+1

@lepdeffard Tek bir işlevi kullanmak zor bir gereklilik midir? Öyle değilse, mevcut işlevinizi 'powerset 'olarak yeniden adlandırabilir ve' powerset' öğesini 'powerset 've' nub' bileşimi olarak tanımlayabilirsiniz. – kraskevich

+0

Bunun işe yarayacağını düşünüyorum. Teşekkür ederim :) – lepdeffard