2014-09-02 9 views
6

Lassen Sie uns sagen, ich habe zwei Arten von ProduktenWas ist ein cleverer Weg, um alle möglichen Kombinationen dieser beiden Sätze von Gegenständen zu finden?

data Item1 = A | B | C 
data Item2 = D | E | F 

und zwei Sätze

set1 = [A,B,C] 
set2 = [D,E,F] 

Ich mag würde alle einzigartige Möglichkeiten der Anpassung der Produkte von zwei Sätze zu finden, sollte die Antwort (in informeller werden Notation):

AD,BE,CF 
AD,BF,CE 
AE,BD,CF 
AE,BF,CD 
AF,BD,CE 
AF,BE,CD 

Mit anderen Worten, würde ich eine Funktion wie die folgenden erreichen:

combine :: [Item1] -> [Item2] -> [[(Item1,Item2)]] 
combine = undefined 

Hinweis sollte jede Kombination ein Tupel sein, und jede Zeile in der Aufzählung Schema oben sollte eine Liste sein, zum Beispiel:

[(A,D),(B,E),(C,F)] 

Antwort

7

verwenden

import Data.List (sort, permutations) 
combine as bs = zipWith zip (repeat as) (sort $ permutations bs) 
+0

FYI: 'permutations' ist Teil des Moduls 'Data.List'. –

+0

Die Einfügung der Sortierfunktion dient nur dazu, die Ausgabe in der von Ihnen beschriebenen Reihenfolge zu geben. Wenn Sie Ihre eigene "Permutations" -Funktion schreiben würden, würden Sie sie nicht brauchen und Sie könnten die "Kombinieren" -Funktion allgemeiner gestalten. – randomusername

+1

@Rhymoid Vielen Dank, ich habe gerade bearbeitet, um diese Abhängigkeit zu zeigen. – randomusername

Verwandte Themen