Учитывая два списка, я могу создать список всех перестановок Декартово произведение этих двух списков:
permute :: [a] -> [a] -> [[a]]
permute xs ys = [ [x, y] | x <- xs, y <- ys ]
Example> permute [1,2] [3,4] == [ [1,3], [1,4], [2,3], [2,4] ]
Как расширить permute, чтобы вместо двух списков он брал список (длина n) списков и возвращал список списков (длина n)
permute :: [[a]] -> [[a]]
Example> permute [ [1,2], [3,4], [5,6] ]
== [ [1,3,5], [1,3,6], [1,4,5], [1,4,6] ] --etc
Я не смог найти ничего релевантного в Hoogle ... единственная функция, соответствующая подписи, была transpose
, которая не выдает желаемый результат.
Редактировать: Я думаю, что версия с 2 списками по сути является декартовым продуктом , но я не могу обернуться вокруг реализации n-арного декартового продукта . Есть указатели?