distinct :: (Eq a) => Int -> [a] -> [[a]] distinct 0 _ = [[]] distinct n xs = [ (h:ts) | ts <- distinct (n - 1) xs , h <- xs, h `notElem` ts] transform :: (Eq a) => [a] -> [(a,a,a,a)] transform = map (\[d, c, b, a] -> (a, b, c, d)) . distinct 4