Я думаю, что проблема заключается в вашем понимании понимания списка. Попробуйте следующее:
[(x, y) | x <- [1,2,3], y <- [1,2]]
Это декартово произведение, возвращающее [(1,1), (1,2), (2,1), (2,2), (3,1), (3,2)]
.
Самый простой способ получить то, что вы хотите (если я вас правильно понял), это, вероятно, написать рекурсию самостоятельно. Также вполне возможно сделать это с помощью комбинации функций списка.