Это работает, потому что использование списков в качестве монад в Haskell делает их моделью неопределенности.Рассмотрим:
sequence [[1,2],[3,4]]
По определению это то же самое, что и:
do x <- [1,2]
y <- [3,4]
return [x,y]
Просто прочитайте это как «Сначала выбор между 1 и 2, затем выбор между 3 и 4».Монада списка теперь будет накапливать всех возможных результатов - отсюда и ответ [[1,3],[1,4],[2,3],[2,4]]
.
(для еще более запутанного примера см. здесь )