2014-09-02 14 views
6

Diciamo che ho due tipi di oggettiQual è un modo intelligente per trovare tutte le possibili combinazioni di questi due gruppi di articoli?

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

e due set

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

Mi piacerebbe trovare tutti i modi unici di corrispondere le voci di due set, la risposta dovrebbe essere (in informali notazione):

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

In altre parole, vorrei qualche funzione che compiere la seguente:

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

Nota ciascuna combinazione dovrebbe essere una tupla, e ogni riga nello schema di enumerazione sopra dovrebbe essere una lista, ad esempio:

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

risposta

7

Usa questa

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

proposito: 'permutations' è parte del modulo 'Data.List'. –

+0

L'inclusione della funzione di ordinamento è solo per dare l'output nell'ordine che hai descritto. Se hai scritto la tua funzione 'permutations', non ne avresti avuto bisogno e potresti rendere la funzione' combine' più generale. – randomusername

+1

@Rhymoid Grazie, ho appena modificato per mostrare questa dipendenza. – randomusername

Problemi correlati