In my initial attempt of today’s Programming Praxis exercise, I misunderstood the problem. Rather than producing all sets of pairs, I instead produced all pairs. Below is the revised solution. Note that it produces a different output than the provided solution. This is because the provided solution only rotates clockwise and not counterclockwise. However, since the problem asks to produce all possible pairs I feel this is a more correct solution.
Given a list, we produce all possible combinations containing the first element. We combine each of those solutions with all possible pairings of the remaining elements.
pairSets :: Eq a => [a] -> [[(a, a)]] pairSets  = [] pairSets (x:xs) = concat [(map ((x,b) : ) . pairSets $ delete b xs) | b <- xs]
Some tests to see if everything is working properly:
main :: IO () main = do mapM_ print $ pairSets [1..4] mapM_ print $ pairSets [1..6]