map (take n) (take (product [1..n]) (permutations ([1..n] ++ undefined))) == permutations [1..n]
>>> permutations "abc" ["abc","bac","cba","bca","cab","acb"]
>>> permutations [1, 2] [[1,2],[2,1]]
>>> permutations [] [[]]This function is productive on infinite inputs:
>>> take 6 $ map (take 3) $ permutations ['a'..] ["abc","bac","cba","bca","cab","acb"]
>>> permutations "abc" ["abc","bac","cba","bca","cab","acb"]The permutations function is maximally lazy: for each n, the value of permutations xs starts with those permutations that permute take n xs and keep drop n xs. This function is productive on infinite inputs:
>>> take 6 $ map (take 3) $ permutations ['a'..] ["abc","bac","cba","bca","cab","acb"]Note that the order of permutations is not lexicographic. It satisfies the following property:
map (take n) (take (product [1..n]) (permutations ([1..n] ++ undefined))) == permutations [1..n]
>>> permutations "abc" ["abc","bac","cba","bca","cab","acb"]
> permutations "abc" ["abc","bac","cba","bca","cab","acb"]
>>> take 6 (fmap (take 3) (permutations (0...))) [[0,1,2],[1,0,2],[2,1,0],[1,2,0],[2,0,1],[0,2,1]]
>>> permutations mempty Slist {sList = [Slist {sList = [], sSize = Size 0}], sSize = Size 1} >>> permutations $ slist "abc" Slist {sList = [Slist {sList = "abc", sSize = Size 3},Slist {sList = "bac", sSize = Size 3},Slist {sList = "cba", sSize = Size 3},Slist {sList = "bca", sSize = Size 3},Slist {sList = "cab", sSize = Size 3},Slist {sList = "acb", sSize = Size 3}], sSize = Size 6}
test = runPermutation $ (,,) <$> toPermutationWithDefault "" (some (char 'a')) <*> toPermutation (char 'b') <*> toPermutationWithDefault '_' (char 'c')
permutations1 = fmap fromList . permutations . toList
permutations1 = fmap fromList . permutations . toListSince: 4.20.0.0
>>> permutationsort ([16, 23, 4, 8, 15, 42] :: [Int]) [4,8,15,16,23,42]
>>> permutationsort ([(1, 16), (5, 23), (2, 4) ,(3, 8), (0, 15) , (4, 42)] :: [(Int, Int)]) [(0,15),(1,16),(2,4),(3,8),(4,42),(5,23)]