PERMUTAÇÃO
------------------------ CODIFICACAO ------------------------
permutations :: [a] -> [[a]]
permutations [] = [[]]
permutations (x:xs) = [zs | ys <- permutations xs, zs <- everywhere x ys]
everywhere :: a -> [a] -> [[a]]
everywhere x [] = [[x]]
everywhere x (y:ys) = (x:y:ys) : [y:zs | zs <- everywhere x ys]
------------------------ AVALIACOES ------------------------
##### MEU TESTE #####
Main> permutations [1..3]
[[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]]
(334 reductions, 650 cells)
#####################
##### TESTE PROFESSOR #####
Main> perm [1..3]
[[1,2,3],[1,3,2],[2,3,1],[2,1,3],[3,1,2],[3,2,1]]
(552 reductions, 930 cells)
###########################
------------------------------------------------------------
##### MEU TESTE #####
Main> last(permutations[1..5])
[5,4,3,2,1]
(1062 reductions, 2901 cells)
#####################
##### TESTE PROFESSOR #####
Main> last (perm [1..5])
[5,4,3,2,1]
(6841 reductions, 12752 cells)
###########################
------------------------------------------------------------
##### MEU TESTE #####
Main> last(permutations[1..10])
[10,9,8,7,6,5,4,3,2,1]
(34091382 reductions, 112137312 cells, 113 garbage collections)
#####################
##### TESTE PROFESSOR #####
Main> last (perm [1..10])
[10,9,8,7,6,5,4,3,2,1]
(239446666 reductions, 507490378 cells, 514 garbage collections)
###########################
------------------------------------------------------------
##### MEU TESTE #####
Main> permutations ['a'..'d']
["abcd","bacd","bcad","bcda","acbd","cabd","cbad","cbda","acdb","cadb","cdab","cdba",
"abdc","badc","bdac","bdca","adbc","dabc","dbac","dbca","adcb","dacb","dcab","dcba"]
(2306 reductions, 3430 cells)
#####################
##### TESTE PROFESSOR #####
Main> perm ['a'..'d']
["abcd","abdc","acdb","acbd","adbc","adcb","bcda","bcad","bdac","bdca","bacd","badc",
"cdab", "cdba","cabd","cadb","cbda","cbad","dabc","dacb","dbca","dbac","dcab","dcba"]
(3376 reductions, 5119 cells)
###########################
------------------------------------------------------------
##### MEU TESTE #####
Main> last (permutations ['a'..'k'])
"kjihgfedcba"
(393342890 reductions, 1309641670 cells, 1327 garbage collections)
#####################
##### TESTE PROFESSOR #####
Main> last (perm ['a'..'k'])
"kjihgfedcba"
(2713744923 reductions, 1566841607 cells, 5943 garbage collections)
###########################
------------------------ RESULTADOS ------------------------
Observando a performance de ambos os programas permutando vários grupos de elementos chegamos a conclusão de que a codificação apresentada pelo professor, talvez pelo fato de utilizar várias funções (4 funções vs 2 funções da minha codificação) precisou de mais reduções para executar todas as permutações.
Também foi possível observar que, não importando se estamos permutando números ou letras, quanto mais elementos são permutados maior é a diferença do tempo de resposta de cada uma das codificações.