Удаление синтаксического сахара: понимание списка в Haskell

Могу ли я осмыслить понимание списка в этом выражении:

[(i,j) | i <- [1..4], j <- [i+1..4]]

Это вывод:

[(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]

Как я могу с помощью карты, фильтра и так далее написать этот фрагмент кода?

редактировать

Вот другой:

[(i,j,k) | i <- [1..6], j <- [i+1..6],k <- [j+1..6]]

Это вывод:

[(1,2,3),(1,2,4),(1,2,5),(1,2,6),(1,3,4),(1,3,5),(1,3,6),(1,4,5),(1,4,6),(1,5,6),(2,3,4),(2,3,5),(2,3,6),(2,4,5),(2,4,6),(2,5,6),(3,4,5),(3,4,6),(3,5,6),(4,5,6)]

Ответы на вопрос(4)

Ваш ответ на вопрос