2014-09-02 19 views
6

Powiedzmy mam dwa rodzaje elementówJaki jest sprytny sposób na znalezienie wszystkich możliwych kombinacji tych dwóch zestawów przedmiotów?

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

i dwa zestawy

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

Chciałbym, aby znaleźć wszystkie unikalne sposoby dopasowywania elementów z dwóch zestawów, odpowiedź powinna być (w nieformalny notacja):

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

innymi słowy, chciałbym jakąś funkcję, która wykonać następujące czynności:

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

Uwaga każda kombinacja powinna być krotką, a każdy wiersz w systemie wyliczania powyżej powinna być lista, na przykład:

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

Odpowiedz

7

Użyj tego

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

FYI: 'permutations' jest część modułu 'Data.List'. –

+0

Włączenie funkcji sortowania polega na podaniu wyniku w podanej kolejności. Jeśli napisałeś własną funkcję "permutacji", to nie będziesz jej potrzebował i możesz uczynić funkcję "łączenia" bardziej ogólną. – randomusername

+1

@Rhymoid Dziękuję, właśnie edytowałem, aby pokazać tę zależność. – randomusername

Powiązane problemy